たとえば、非同期の A.func1() があり、オブジェクト x1 を返すことができます。また、同じく非同期で、x1 に基づいて実行する必要がある B.func2() もあります。 .func2 は最終値 t を返し、この最終値 t に基づいていくつかのプロンプト表示が実行されます。これはどうやって書けばいいのでしょうか?
自分で書いたコードはこんな感じ
でも、使っても使わなくても効果は同じような気がします...やはりピラミッドに戻ってしまいます
世界只因有你2017-05-15 16:53:30
「連続Promise呼び出し時の状態保存」についてのコメントの補足を受けて、いくつかの戦略について詳しく説明したいと思います
つまり、A.func1、B.func2、および匿名関数 (func3 と呼びます) の呼び出しプロセスに状態が含まれないようにロジックを調整します。つまり、func3 が次の出力のみに依存するようにします。 func1 の出力ではなく func2; または func2 が func1 に依存しないようにするには、 Promise.all
のようなものを使用して func1 と func2 の結果を同時に取得し、 func3Promise.all
来同时拿到func1和func2的结果丢给func3
优点:state可扩展state.x2 .x3 ...
问题:很长的调用链带复杂状态的话,很容易污染出bug,代码可维护性下降严重
js
function yourLogic() { var state = {}; return A.func1() .then(function(x1) { state.x1 = x1; return B.func2(x1); }) .then(function(t) { //play with t & state.x1 return yourResult; }); }
bluebird
にスローします。
問題: 長い呼び出しチェーンに複雑な状態がある場合、バグが混入しやすく、コードの保守性が大幅に低下します
リーリー
bluebird
のバインド メソッドは thisArg にバインドでき、状態を保持するために使用できます。原理は同じですリーリー
中字:臨時追加配信欠点: 長い呼び出しチェーンの各ステップに状態がある場合、非常に冗長になります
リーリーもちろん、ここの内部も自分でカプセル化して最適化することができます
リーリー #🎜🎜#最後の解決策: 閉鎖メンテナンス状態#🎜🎜# #🎜🎜#実際、これは質問の本来の書き方であり、主な問題は、質問が元の「コールバック地獄」またはコールバックピラミッドの当惑にまで格下げされていることだと思います#🎜🎜# #🎜🎜#利点は...機能することです#🎜🎜# リーリー世界只因有你2017-05-15 16:53:30
次のように、then
で Promise
オブジェクトを直接返します: then
里面返回一个 Promise
的对象,如下:
javascript
A.func1() .then(function (x1) { return B.func2(x1); }) .then(function (t) { // do something });
针对你评论中说的问题,如果不使用第三方的 Promise
库的话,可以像下面这样使用:
javascript
var promise = new Promise(function (resolve, reject) { var firstValue; A.func1() .then(function (x1) { firstValue = x1; // 临时保存 return B.func2(x1); }, reject) .then(function (x2) { resolve({ firstValue: firstValue, secondValue: x2 }); }, reject); }); promise.then(function (result) { console.log(result); // {"firstValue": "Hello", "secondValue": "World"} });
使用第三方的 Promise
リーリー
<時間>
Promise
ライブラリを使用しない場合は、次のように使用できます: #🎜🎜#
リーリー
#🎜🎜#サードパーティの Promise
ライブラリを使用すると、このプロセスを簡素化できます。 #🎜🎜#过去多啦不再A梦2017-05-15 16:53:30
then の関数の戻り値が直接量の場合、それは次のチェーン呼び出しで then のパラメーターとして使用されます。
戻り値に Promise のインターフェイスがある場合、Promise の解決の結果は次のようになります。
例として q を使用します