4

私はこのコードの違いを本当に理解していません:

co(function *() {
    const val = yield aPromise();
    return val;
})
.then((val) => doSomethingWith(val), (err) => doSomethingWith(err));

そして、この他のもの:

async function () {
    try {
        const val = await aPromise();
        doSomethingWith(val);
    } catch (err) {
        doSomethingWith(err);
    }
}

ブラウザーまたはサーバー (node.js) で使用される各コードの長所/短所 (主にパフォーマンス、読みやすさ、およびフロー制御の観点から) と、co ( co 外部ライブラリーに依存) または await (これはまだ ES7 の一部ではなく、babel-polyfillに依存しています) が使用されます。

4

1 に答える 1

5

あなたが示したサンプルコードの2つの大きな違い:

  • 最初のスニペットは関数を実行して promise を作成しますが、2 番目のスニペットは関数を宣言するだけです
  • 最初のスニペットは からのエラーをキャッチしません。との違いをdoSomethingWith見てください。.then(…).catch(…).then(…, …)

さて、あなたが実際に比較したかったのは

var example = co.wrap(function *() {
    try {
        const val = yield aPromise();
        doSomethingWith(val);
    } catch (err) {
        doSomethingWith(err);
    }
})

async function example() {
    try {
        const val = await aPromise();
        doSomethingWith(val);
    } catch (err) {
        doSomethingWith(err);
    }
}

そしておそらく

function example() {
    return aPromise().then(doSomethingWith).catch(doSomethingWith);
}

aPromise(最後のものは、同期的にスローする場合、実際には異なる動作をしますが、もちろん決して行うべきではありません)

それでは議論しましょう

パフォーマンス

重要ではない。本当にありません。3 番目のものは作成されるプロミスの量が最も少ないため最速である可能性がありますが、他の 2 つはまだエンジンで適切に最適化されていません。

可読性

自分で選んでください。最初の 2 つはほとんど同じですcoが、少し醜いです (ジェネレーターの構文を悪用しています)。3 番目は非常に簡潔であり、そのため有利になる可能性があります。

フロー制御

それは賛否両論の問題ではなく、あなたが望むものでなければなりません。

なぜ co または await を使用する必要があるのですか?

coこれ以上使用しないでください。標準の ES8 (ES2017) async/ await(まだ公開されていませんが、まだ) に取って代わられています。トランスパイラーのターゲット (ES6 をサポートするが ES8 をサポートしない環境の場合) として、または約束以外のもので使用された場合の後方互換性のために (co がより多くのタイプの「yieldables」をサポートしていることを考えると) 引き続き使用される可能性があります。

于 2016-10-21T06:29:34.980 に答える