2016-12-06 5 views
1

内ですぐに実行できるように設計されている理由:約束がMDNによると

executor機能をため、実際の理由だった何決意を渡して、約束の実装によってすぐに実行し、機能

を拒否されましたこの決定? なぜ約束は怠惰ではないのですか?

+2

あなたの質問は、「怠惰な」約束は何らかの形で優れていると思われますが、あなたはそれがどのような方法であるかを指定することを怠ります。怠惰な約束の実装はあなたのように見えますか?利点は何でしょうか? –

+0

私は思っていた、と考え、_長い間、約束は怠け者でした(彼らが何かまで評価されなかった)。私はそれがちょうど "単純な"この方法だと思う。 – 131

+0

非同期インターフェイスのポイントは、**操作**を開始してから、将来、いつか完了したら、その結果を関係者に通知することができます。したがって、executor関数のポイントは、非同期操作をすぐに開始できるようにすることです(待機中のポイントはありません)。 – jfriend00

答えて

3

この決定の実際の理由は何でしたか?

コールバックと暴露のPromiseコンストラクタはちょうどimprovement over the older deferred patternました。コールバックは決して評価時間にわたって選択肢を提供するものではなく、リゾルバ関数のエラー処理をスコープで提供することになっています。

なぜ約束が怠惰ではないのですか?

プロビジョニングは非同期の結果値を表すため、これ以上のものはありません。それらは、遅延を特徴とすることなく(そして計算全体を表す、スタート/リピートする方法などで)シンプルに保たれています。代わりに約束を返す関数を使うことで、簡単にそれを得ることができます。 Promiseの実行機能がimmediatellyと呼ばれる理由私は理解して、質問を自分自身を求めるだろう

function doStuff() { 
    return new Promise((resolve, reject) => { // execution function 
     // Do stuff here 
    }); 
} 

+0

私はそれが何も解決しないので、ここのシンプルさは良いとは言いません。怠惰なものに対して直ちに実行することのいくつかの利点を見たいと思います –

+0

最も簡単な利点:遅延値を強制するタイミングを決定するのは難しいためです。多くの可能性があり、普遍的なものはありません。 – Bergi

+0

私は、それまたは他の追加の方法のために 'then'を使用することは非常に明白だと思います。それほど強くない利点 –

1

約束を継続し、標準Promiseオブジェクトの実際の状態を提供することを意図していることは、次のパターンを提案している場所あなたは約束のものをするだろうか?

明らかに、これはimmediatellyと呼ばれていますが、いくつかのものが正常にまたは不成功に終わると約束しているので、呼び出し元に混乱を避けるために囲み関数を呼び出すとすぐに処理が開始されるはずです。

+0

jsの遅延操作はかなり簡単です。あなたは、例えば、Bluebird実装のPromise.allの引数として、そのような関数の束を使用することはできません。 –

+0

@RaxWunterジェネレータについて話していますか? –

+0

@Rax 'Promise.all'に関数自体を渡すことはありません。関数の結果を渡すことになります。 – 4castle

0

約束のポイントは、呼び出し元がコールバックを渡すのではなく、そのコールバックを渡すことができる関数から何かを返すことです。コンストラクタは、「なぜ」と答える赤い鳴き声です。不完全な世界のコールバックスタイルのコード。

すべてのJS関数は、約束を返すものであっても、同期しています(es8のasyncは構文的な砂糖です)。

統一されたエラー処理を提供するPromiseコンストラクタのexecutor関数が存在します。検討してください:

function foo() { 
    ""(); // throws TypeError 
    return Promise(resolve => { 
    ""(); // rejects promise with TypeError 
    }); 
} 

発信者には両方ともtry{ foo().catch(failed); } catch(e) { failed(e); } = Sucksが必要です。

したがって、すべての同期コードをexecutor関数内に配置して、呼び出し元のエラーを統一します。それが私があなたの本当の疑問だと思うものです。

"レイジー"実行は、すべてのコードのエラー処理を統一する目的を無効にします。