.then()チェーンで以前のpromiseの結果にアクセスするにはどうすればよいですか?

674
Bergi 2015-02-01 00:41.

私はに私のコードを再構築してきた約束、そして素晴らしい長い建てフラット約束チェーンを複数からなる、.then()コールバック。最後に、いくつかの複合値を返したいので、複数の中間のpromise結果にアクセスする必要があります。ただし、シーケンスの途中からの解像度値は、最後のコールバックのスコープ内にありません。どのようにアクセスしますか?

function getExample() {
    return promiseA(…).then(function(resultA) {
        // Some processing
        return promiseB(…);
    }).then(function(resultB) {
        // More processing
        return // How do I gain access to resultA here?
    });
}

16 answers

391
Bergi 2015-02-01 00:44.

チェーンを壊す

チェーンの中間値にアクセスする必要がある場合は、チェーンを必要な単一の部分に分割する必要があります。1つのコールバックをアタッチして、そのパラメーターを複数回使用しようとする代わりに、結果値が必要な場合は常に、同じPromiseに複数のコールバックをアタッチします。約束は単に将来の価値を表す(プロキシする)ことを忘れないでください!線形チェーンで一方のpromiseを他方から導出する次に、ライブラリから提供されたpromiseコンビネータを使用して結果値を作成します。

これにより、非常に単純な制御フロー、機能の明確な構成、したがって簡単なモジュール化が実現します。

function getExample() {
    var a = promiseA(…);
    var b = a.then(function(resultA) {
        // some processing
        return promiseB(…);
    });
    return Promise.all([a, b]).then(function([resultA, resultB]) {
        // more processing
        return // something using both resultA and resultB
    });
}

その後のコールバックでのパラメーターの破棄はPromise.allES6でのみ使用可能になりましたが、ES5では、then呼び出しは多くのPromiseライブラリ(QBluebirdwhen、…)によって提供される気の利いたヘルパーメソッドに置き換えられました.spread(function(resultA, resultB) { …

ブルーバードは、専用の特長join機能をその置き換えるためにPromise.all+のspread単純(かつ効率的)構造と組み合わせました:

…
return Promise.join(a, b, function(resultA, resultB) { … });
247
Bergi 2015-02-01 00:43.

ECMAScriptハーモニー

もちろん、この問題は言語設計者によっても認識されていました。彼らは多くの仕事をし、非同期関数の提案はついにそれを実現しました

ECMAScript 8

then非同期関数(呼び出されたときにpromiseを返す)のように、promiseが直接解決されるのを待つだけでよいため、単一の呼び出し関数やコールバック関数はもう必要ありません。また、条件、ループ、try-catch-clausesなどの任意の制御構造も備えていますが、便宜上、ここでは必要ありません。

async function getExample() {
    var resultA = await promiseA(…);
    // some processing
    var resultB = await promiseB(…);
    // more processing
    return // something using both resultA and resultB
}

ECMAScript 6

ES8を待っている間、私たちはすでに非常によく似た種類の構文を使用していました。ES6にはジェネレーター関数が付属しており、任意に配置されたyieldキーワードで実行を分割することができます。これらのスライスは、独立して、非同期でさえ、次々に実行できます。これは、次のステップを実行する前に、promiseの解決を待ちたいときに行うことです。

専用のライブラリ(cotask.jsなど)がありますが、多くのPromiseライブラリにはヘルパー関数(QBluebirdwhen、…)があり、ジェネレーター関数を指定すると、この非同期の段階的な実行が行われます。約束をもたらします。

var getExample = Promise.coroutine(function* () {
//               ^^^^^^^^^^^^^^^^^ Bluebird syntax
    var resultA = yield promiseA(…);
    // some processing
    var resultB = yield promiseB(…);
    // more processing
    return // something using both resultA and resultB
});

これはバージョン4.0以降のNode.jsで機能しました。また、いくつかのブラウザー(またはその開発エディション)は比較的早い段階でジェネレーター構文をサポートしていました。

ECMAScript 5

ただし、下位互換性が必要な場合は、トランスパイラーなしで使用することはできません。ジェネレーター関数と非同期関数の両方が現在のツールでサポートされています。たとえば、ジェネレーター非同期関数に関するBabelのドキュメントを参照してください。

そして、 非同期プログラミングを容易にすることに専念している他の多くのJSへコンパイル言語もあります。彼らは通常と同様の構文を使用await(例えば、アイスのCoffeeScriptを)が、Haskellのような特徴と、他にもありますdo-notation(例えばLatteJsモナドPureScriptまたはLispyScriptが)。

103
Esailija 2015-02-01 03:16.

同期検査

後で必要な値のpromiseを変数に割り当て、同期検査を介してそれらの値を取得します。この例ではbluebirdの.value()方法を使用していますが、多くのライブラリが同様の方法を提供しています。

function getExample() {
    var a = promiseA(…);

    return a.then(function() {
        // some processing
        return promiseB(…);
    }).then(function(resultB) {
        // a is guaranteed to be fulfilled here so we can just retrieve its
        // value synchronously
        var aValue = a.value();
    });
}

これは、必要な数の値に使用できます。

function getExample() {
    var a = promiseA(…);

    var b = a.then(function() {
        return promiseB(…)
    });

    var c = b.then(function() {
        return promiseC(…);
    });

    var d = c.then(function() {
        return promiseD(…);
    });

    return d.then(function() {
        return a.value() + b.value() + c.value() + d.value();
    });
}
58
Bergi 2015-02-01 00:42.

ネスト(および)クロージャ

変数のスコープ(この場合は成功コールバック関数パラメーター)を維持するためにクロージャーを使用することは、自然なJavaScriptソリューションです。promiseを使用すると、 .then()コールバックを任意にネストしてフラット化できます。内部のコールバックのスコープを除いて、意味的には同等です。

function getExample() {
    return promiseA(…).then(function(resultA) {
        // some processing
        return promiseB(…).then(function(resultB) {
            // more processing
            return // something using both resultA and resultB;
        });
    });
}

もちろん、これはインデントピラミッドを構築しています。インデントが大きくなりすぎた場合でも、古いツールを適用して、運命ピラミッドに対抗することができます。モジュール化して、追加の名前付き関数を使用し、変数が不要になったらすぐにプロミスチェーンをフラット化します。
理論的には、(すべてのクロージャを明示的にすることで)2レベルを超えるネストを常に回避でき、実際には妥当な数だけ使用します。

function getExample() {
    // preprocessing
    return promiseA(…).then(makeAhandler(…));
}
function makeAhandler(…)
    return function(resultA) {
        // some processing
        return promiseB(…).then(makeBhandler(resultA, …));
    };
}
function makeBhandler(resultA, …) {
    return function(resultB) {
        // more processing
        return // anything that uses the variables in scope
    };
}

また、この種のヘルパー関数を使用することができ、部分的アプリケーションのように、_.partialからアンダー/ lodashまたはネイティブ.bind()メソッドはさらに減少のインデントに、:

function getExample() {
    // preprocessing
    return promiseA(…).then(handlerA);
}
function handlerA(resultA) {
    // some processing
    return promiseB(…).then(handlerB.bind(null, resultA));
}
function handlerB(resultA, resultB) {
    // more processing
    return // anything that uses resultA and resultB
}
50
Bergi 2015-02-01 00:42.

明示的なパススルー

コールバックのネストと同様に、この手法はクロージャに依存しています。それでも、チェーンはフラットなままです。最新の結果だけを渡すのではなく、すべてのステップでいくつかの状態オブジェクトが渡されます。これらの状態オブジェクトは、前のアクションの結果を蓄積し、後で再び必要になるすべての値と現在のタスクの結果を渡します。

function getExample() {
    return promiseA(…).then(function(resultA) {
        // some processing
        return promiseB(…).then(b => [resultA, b]); // function(b) { return [resultA, b] }
    }).then(function([resultA, resultB]) {
        // more processing
        return // something using both resultA and resultB
    });
}

ここで、その小さな矢印b => [resultA, b]は、を閉じてresultA、両方の結果の配列を次のステップに渡す関数です。これは、パラメーター分解構文を使用して、パラメーターを再び単一の変数に分割します。

ES6でデストラクチャリングが利用可能になる前は、呼び出された気の利いたヘルパーメソッド.spread()が多くのpromiseライブラリ(QBluebirdwhen、…)によって提供されていました。として使用される複数のパラメーター(配列要素ごとに1つ)を持つ関数を取ります.spread(function(resultA, resultB) { …

もちろん、ここで必要なクロージャーは、いくつかのヘルパー関数によってさらに単純化できます。

function addTo(x) {
    // imagine complex `arguments` fiddling or anything that helps usability
    // but you get the idea with this simple one:
    return res => [x, res];
}

…
return promiseB(…).then(addTo(resultA));

または、を使用Promise.allして配列のpromiseを生成することもできます。

function getExample() {
    return promiseA(…).then(function(resultA) {
        // some processing
        return Promise.all([resultA, promiseB(…)]); // resultA will implicitly be wrapped
                                                    // as if passed to Promise.resolve()
    }).then(function([resultA, resultB]) {
        // more processing
        return // something using both resultA and resultB
    });
}

また、配列だけでなく、任意に複雑なオブジェクトを使用する場合もあります。たとえば、別のヘルパー関数を使用する_.extend場合Object.assignと使用する場合です。

function augment(obj, name) {
    return function (res) { var r = Object.assign({}, obj); r[name] = res; return r; };
}

function getExample() {
    return promiseA(…).then(function(resultA) {
        // some processing
        return promiseB(…).then(augment({resultA}, "resultB"));
    }).then(function(obj) {
        // more processing
        return // something using both obj.resultA and obj.resultB
    });
}

このパターンはフラットチェーンを保証し、明示的な状態オブジェクトは明快さを向上させることができますが、長いチェーンでは面倒になります。特に、状態が散発的にしか必要ない場合でも、すべてのステップを通過する必要があります。この固定インターフェースにより、チェーン内の単一のコールバックはかなり緊密に結合され、変更するのに柔軟性がありません。これにより、単一ステップの因数分解が難しくなり、コールバックを他のモジュールから直接提供することはできません。コールバックは、状態を考慮した定型コードで常にラップする必要があります。上記のような抽象的なヘルパー関数は、痛みを少し和らげることができますが、常に存在します。

35
Bergi 2015-02-01 00:43.

可変コンテキスト状態

些細な(しかしエレガントではなく、エラーが発生しやすい)解決策は、スコープの高い変数(チェーン内のすべてのコールバックがアクセスできる)を使用し、取得時に結果値を書き込むことです。

function getExample() {
    var resultA;
    return promiseA(…).then(function(_resultA) {
        resultA = _resultA;
        // some processing
        return promiseB(…);
    }).then(function(resultB) {
        // more processing
        return // something using both resultA and resultB
    });
}

多くの変数の代わりに、(最初は空の)オブジェクトを使用することもできます。このオブジェクトには、動的に作成されたプロパティとして結果が保存されます。

このソリューションにはいくつかの欠点があります。

  • なぜグローバルステートはとても邪悪なのですか?状態は醜くなぜグローバルステートはとても邪悪なのですか?です。
  • このパターンは関数の境界を越えて機能しません。関数の宣言が共有スコープを離れてはならないため、関数のモジュール化は困難です。
  • 変数のスコープは、初期化される前に変数にアクセスすることを妨げません。これは、競合状態が発生する可能性のある複雑なプロミス構造(ループ、分岐、例外)で特に発生する可能性があります。状態を明示的に渡すことは、奨励を約束する宣言型の設計であり、これを防ぐことができるよりクリーンなコーディングスタイルを強制します。
  • これらの共有変数のスコープを正しく選択する必要があります。たとえば、状態がインスタンスに格納されている場合のように、複数の並列呼び出し間の競合状態を防ぐために、実行された関数に対してローカルである必要があります。

Bluebirdライブラリは、渡されるオブジェクトの使用を推奨し、そのbind()メソッドを使用してコンテキストオブジェクトをpromiseチェーンに割り当てます。他の方法では使用できないthisキーワードを介して、各コールバック関数からアクセスできます。オブジェクトのプロパティは変数よりもタイプミスが検出されにくい傾向がありますが、パターンは非常に巧妙です。

function getExample() {
    return promiseA(…)
    .bind({}) // Bluebird only!
    .then(function(resultA) {
        this.resultA = resultA;
        // some processing
        return promiseB(…);
    }).then(function(resultB) {
        // more processing
        return // something using both this.resultA and resultB
    }).bind(); // don't forget to unbind the object if you don't want the
               // caller to access it
}

このアプローチは、.bindをサポートしないpromiseライブラリで簡単にシミュレートできます(ただし、多少冗長な方法であり、式で使用することはできません)。

function getExample() {
    var ctx = {};
    return promiseA(…)
    .then(function(resultA) {
        this.resultA = resultA;
        // some processing
        return promiseB(…);
    }.bind(ctx)).then(function(resultB) {
        // more processing
        return // something using both this.resultA and resultB
    }.bind(ctx));
}
16
Jay 2017-03-25 10:08.

「ミュータブルコンテキスト状態」のそれほど厳しくないスピン

ローカルスコープのオブジェクトを使用してプロミスチェーンの中間結果を収集することは、提起した質問に対する合理的なアプローチです。次のスニペットについて考えてみます。

function getExample(){
    //locally scoped
    const results = {};
    return promiseA(paramsA).then(function(resultA){
        results.a = resultA;
        return promiseB(paramsB);
    }).then(function(resultB){
        results.b = resultB;
        return promiseC(paramsC);
    }).then(function(resultC){
        //Resolve with composite of all promises
        return Promise.resolve(results.a + results.b + resultC);
    }).catch(function(error){
        return Promise.reject(error);
    });
}
  • グローバル変数は悪いので、このソリューションはローカルスコープの変数を使用しますが、害はありません。関数内でのみアクセスできます。
  • 変更可能な状態は醜いですが、これは醜い方法で状態を変更しません。醜い可変状態は、伝統的に関数の引数またはグローバル変数の状態を変更することを指しますが、このアプローチは、promiseの結果を集約することのみを目的として存在するローカルスコープの変数の状態を変更するだけです...単純な死を迎える変数約束が解決したら。
  • 中間のpromiseが結果オブジェクトの状態にアクセスすることを妨げられることはありませんが、これは、チェーン内のpromiseの1つが不正になり、結果を妨害するという恐ろしいシナリオを導入しません。promiseの各ステップで値を設定する責任はこの関数に限定され、全​​体的な結果は正しいか正しくないかのどちらかになります...それは(意図しない限り)本番環境で数年後に発生するバグではありません。 !)
  • これは、getExample関数の呼び出しごとに結果変数の新しいインスタンスが作成されるため、並列呼び出しから発生する競合状態のシナリオを導入しません。
8
Anthony 2017-01-22 12:14.

Node 7.4は、ハーモニーフラグを使用した非同期/待機呼び出しをサポートするようになりました。

これを試して:

async function getExample(){

  let response = await returnPromise();

  let response2 = await returnPromise2();

  console.log(response, response2)

}

getExample()

次のコマンドでファイルを実行します。

node --harmony-async-await getExample.js

できる限りシンプル!

8
yzfdjzwl 2017-07-25 20:34.

この日、私もあなたのようないくつかの質問に出会うことができます。ついに、私は質問で良い解決策を見つけました、それは簡単で読むのが良いです。これがお役に立てば幸いです。

よるとどのようにツーチェーンのjavascript-約束

わかりました、コードを見てみましょう:

const firstPromise = () => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            console.log('first promise is completed');
            resolve({data: '123'});
        }, 2000);
    });
};

const secondPromise = (someStuff) => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            console.log('second promise is completed');
            resolve({newData: `${someStuff.data} some more data`});
        }, 2000);
    });
};

const thirdPromise = (someStuff) => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            console.log('third promise is completed');
            resolve({result: someStuff});
        }, 2000);
    });
};

firstPromise()
    .then(secondPromise)
    .then(thirdPromise)
    .then(data => {
        console.log(data);
    });
6
Anthony 2015-11-21 09:59.

別の答え、babel-nodeバージョン<6を使用

使用する async - await

npm install -g [email protected]

example.js:

async function getExample(){

  let response = await returnPromise();

  let response2 = await returnPromise2();

  console.log(response, response2)

}

getExample()

次に、実行babel-node example.jsして出来上がり!

2
Anthony 2015-08-12 08:35.

私はグローバル変数の使用があまり好きではないので、このパターンを自分のコードで使用するつもりはありません。ただし、ピンチでは機能します。

ユーザーは有望なマングースモデルです。

var globalVar = '';

User.findAsync({}).then(function(users){
  globalVar = users;
}).then(function(){
  console.log(globalVar);
});
2
amaksr 2017-06-10 14:56.

シーケンシャルエグゼキュータnsynjsを使用した別の答え:

function getExample(){

  var response1 = returnPromise1().data;

  // promise1 is resolved at this point, '.data' has the result from resolve(result)

  var response2 = returnPromise2().data;

  // promise2 is resolved at this point, '.data' has the result from resolve(result)

  console.log(response, response2);

}

nynjs.run(getExample,{},function(){
    console.log('all done');
})

更新:作業例を追加

function synchronousCode() {
     var urls=[
         "https://ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.min.js",
         "https://ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js",
         "https://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"
     ];
     for(var i=0; i<urls.length; i++) {
         var len=window.fetch(urls[i]).data.text().data.length;
         //             ^                   ^
         //             |                   +- 2-nd promise result
         //             |                      assigned to 'data'
         //             |
         //             +-- 1-st promise result assigned to 'data'
         //
         console.log('URL #'+i+' : '+urls[i]+", length: "+len);
     }
}

nsynjs.run(synchronousCode,{},function(){
    console.log('all done');
})
<script src="https://rawgit.com/amaksr/nsynjs/master/nsynjs.js"></script>

1
alphakevin 2016-06-12 20:33.

bluebirdを使用する場合、.bindメソッドを使用してPromiseチェーン内の変数を共有できます。

somethingAsync().bind({})
.spread(function (aValue, bValue) {
    this.aValue = aValue;
    this.bValue = bValue;
    return somethingElseAsync(aValue, bValue);
})
.then(function (cValue) {
    return this.aValue + this.bValue + cValue;
});

詳細については、次のリンクを確認してください。

http://bluebirdjs.com/docs/api/promise.bind.html

1
Minh Giang 2017-03-03 23:45.
function getExample() {
    var retA, retB;
    return promiseA(…).then(function(resultA) {
        retA = resultA;
        // Some processing
        return promiseB(…);
    }).then(function(resultB) {
        // More processing
        //retA is value of promiseA
        return // How do I gain access to resultA here?
    });
}

簡単な方法:D

1
Vishu 2017-08-30 00:34.

RSVPのハッシュが使えると思います。

以下のようなもの:

    const mainPromise = () => {
        const promise1 = new Promise((resolve, reject) => {
            setTimeout(() => {
                console.log('first promise is completed');
                resolve({data: '123'});
            }, 2000);
        });

        const promise2 = new Promise((resolve, reject) => {
            setTimeout(() => {
                console.log('second promise is completed');
                resolve({data: '456'});
            }, 2000);
        });

        return new RSVP.hash({
              prom1: promise1,
              prom2: promise2
          });

    };


   mainPromise()
    .then(data => {
        console.log(data.prom1);
        console.log(data.prom2);
    });
0
David Spector 2019-08-28 10:17.

解決:

'bind'を使用して、後の 'then'関数のスコープに中間値を明示的に配置できます。これは、Promisesの動作方法を変更する必要がなく、エラーがすでに伝播されているのと同じように、値を伝播するために1行か2行のコードを必要とするだけの優れたソリューションです。

完全な例を次に示します。

// Get info asynchronously from a server
function pGetServerInfo()
    {
    // then value: "server info"
    } // pGetServerInfo

// Write into a file asynchronously
function pWriteFile(path,string)
    {
    // no then value
    } // pWriteFile

// The heart of the solution: Write formatted info into a log file asynchronously,
// using the pGetServerInfo and pWriteFile operations
function pLogInfo(localInfo)
    {
    var scope={localInfo:localInfo}; // Create an explicit scope object
    var thenFunc=p2.bind(scope); // Create a temporary function with this scope
    return (pGetServerInfo().then(thenFunc)); // Do the next 'then' in the chain
    } // pLogInfo

// Scope of this 'then' function is {localInfo:localInfo}
function p2(serverInfo)
    {
    // Do the final 'then' in the chain: Writes "local info, server info"
    return pWriteFile('log',this.localInfo+','+serverInfo);
    } // p2

このソリューションは、次のように呼び出すことができます。

pLogInfo("local info").then().catch(err);

(注:このソリューションのより複雑で完全なバージョンはテストされていますが、このサンプルバージョンはテストされていないため、バグがある可能性があります。)

Related questions

MORE COOL STUFF

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは、夫に会ったとき、典型的な交際のアドバイスに逆らいました。

マイケルシーンが非営利の俳優である理由

マイケルシーンが非営利の俳優である理由

マイケルシーンは非営利の俳優ですが、それは正確にはどういう意味ですか?

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

特徴的なスターのコリン・エッグレスフィールドは、RomaDrama Liveでのスリル満点のファンとの出会いについて料理しました!加えて、大会での彼のINSPIREプログラム。

「たどりつけば」をオンラインでストリーミングできない理由

「たどりつけば」をオンラインでストリーミングできない理由

ノーザンエクスポージャーが90年代の最も人気のある番組の1つになった理由を確認するには、Blu-rayまたはDVDプレーヤーをほこりで払う必要があります。

バイオニック読書はあなたをより速く読むことができますか?

バイオニック読書はあなたをより速く読むことができますか?

BionicReadingアプリの人気が爆発的に高まっています。しかし、それは本当にあなたを速読術にすることができますか?

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖は、世界で2番目に大きいボイリング湖です。そこにたどり着くまでのトレッキングは大変で長いですが、努力する価値は十分にあります。

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

サロンからのヘアトリミングや個人的な寄付は、油流出を吸収して環境を保護するのに役立つマットとして再利用できます。

ホワイトハウスの最も記憶に残る結婚式を見てください

ホワイトハウスの最も記憶に残る結婚式を見てください

過去200年以上の間にホワイトハウスで結婚したのはほんの数人です。彼らは誰でしたか、そしてそこで結婚式を獲得するために何が必要ですか?

驚くほど素晴らしいDropMixミュージックミキシングカードゲームは30ドルで驚くべき取引です

驚くほど素晴らしいDropMixミュージックミキシングカードゲームは30ドルで驚くべき取引です

DropMixはNFC対応のカードゲームで、基本的にはリミックスアーティストになります。現在、Amazonでは$ 30まで下がっており、これまでで最高の価格に匹敵します。ロックバンドで有名なHarmonixによって開発されたDropMixは、おそらく少し野心的すぎるように思われます。結局のところ、ほとんどの人は素晴らしいリズムを持っていませんが、ゲームは驚くほどうまく実行されます。

メアリーJ.ブライジがついにハリウッドウォークオブフェイムスターを獲得

メアリーJ.ブライジがついにハリウッドウォークオブフェイムスターを獲得

写真:APメアリーJ.ブライジは、間もなくハリウッドウォークオブフェイムのスターを獲得します。これは、メアリーJよりもハリウッドウォークオブフェイムのほうが正直なところ恩恵です。

MeltdownとSpectreの脆弱性についてこれまでに知っていることはすべて、簡単な方法で説明されています

MeltdownとSpectreの脆弱性についてこれまでに知っていることはすべて、簡単な方法で説明されています

画像:グラズ工科大学/ NataschaEiblがデザインしたロゴ。MeltdownとSpectreは、攻撃者がシステムメモリに保存されているあらゆる種類の情報にアクセスできるようにする2つの脆弱性に付けられた名前です。

彼のニューヨークの家から追い出されようとしている97歳の第二次世界大戦の獣医。メリーエフィングクリスマス

彼のニューヨークの家から追い出されようとしている97歳の第二次世界大戦の獣医。メリーエフィングクリスマス

日本人に襲われたときに真珠湾にいた97歳の第二次世界大戦のベテランが、ニューヨークのブルックリンから追い出されています。

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya shared a sweet photo in honor of boyfriend Tom Holland's 26th birthday Wednesday

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

シーレン「Ms.JuicyBaby」ピアソンは、先月脳卒中で入院した後、「もう一度たくさんのことをする方法を学ばなければならない」ため、言語療法を受けていることを明らかにしました。

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

オスカー受賞者の世紀半ばの家には、3つのベッドルーム、2つのバス、オーシャンフロントの景色があります。

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、生後4か月の娘、モナコに母乳育児をしていると語った。

投資ノート:Bioscout AU$300万シード

投資ノート:Bioscout AU$300万シード

Bioscoutは、農家を運転席に置くという使命を負っています。Artesian(GrainInnovate)やUniseedと並んで、最新のシードラウンドでチームを支援できることをうれしく思います。問題真菌症による重大な作物の損失は、農民にとって試練であることが証明されています。

リトルマーケットリサーチ1| 2022年のクイックグリンプス遠隔医療市場

リトルマーケットリサーチ1| 2022年のクイックグリンプス遠隔医療市場

遠隔医療は、パンデミック後の時代では新しいものではなく、時代遅れの分野でもありません。しかし、業界を詳しく見ると、需要と供給の強力な持続可能性と、米国で絶え間ない革命となる強力な潜在的成長曲線を示しています。

スタートアップ資金調達環境:タイのスタートアップエコシステムの次は何ですか?

スタートアップ資金調達環境:タイのスタートアップエコシステムの次は何ですか?

2021年は、世界的なベンチャーキャピタル(VC)の資金調達にとって記録的な年でした。DealStreetAsiaによると、東南アジアも例外ではなく、この地域では年間で記録的な25の新しいユニコーンが採掘されました。

ムーアの法則を超えて

ムーアの法則を超えて

計算に対する私たちの欲求とムーアの法則が提供できるものとの間には、指数関数的に増大するギャップがあります。私たちの文明は計算に基づいています—建築と想像力の現在の限界を超える技術を見つけなければなりません。

Language