1

破滅のピラミッドを回避しながら、JS Promises を使用してチェーン 2 JQuery 非同期呼び出しを行うにはどうすればよいですか? 次のように、「JQuery」プロミスを実際のプロミスに変換できることを知っています。

Promise.resolve($.getJSON(url, params));

1 つの約束だけを待ちたい場合は、次のようにすることができます。

Promise.resolve($.getJSON(url1, params1))
.then(function(result){
  // do stuff
});

2 つの異なる ajax 呼び出しが行われるのを待ちたい場合は、次のようにします。

Promise.all(
[
  Promise.resolve($.getJSON(url1, params1)),
  Promise.resolve($.getJSON(url2, params2))
]).then(function(results_array){
  // do stuff
});

ただし、ある呼び出しを別の呼び出しの後にしたい場合、これは機能しません。

Promise.resolve($.getJSON(url1, params1))
.then(function(result){
  //do stuff
  return Promise.resolve($.getJSON(url2, params2));
}).then(function(result){
  //result is a promise, not the results from the second call to getJSON()...
  //and it doesn't even wait for the second call to finish.
  //result.then() is just going to bring me further into the pyramid of doom :(
});

どういうわけか、「do stuff」関数で構築された約束で .then() を呼び出したいと思います。これを行うための慣用的な方法は何ですか?

4

1 に答える 1

3
return Promise.resolve($.getJSON(url2, params2));

あなたがしたことはPromise.resolve、解決済みの値が の結果である ( を介して)既に解決されたプロミスを作成することでした$.get()。これもプロミスです。これが、「2 番目の呼び出しが終了するのを待たない」、「結果が約束である」理由です。

また、promise を返すため、jQuery AJAX 呼び出しをラップする必要はありません。jQuery の promise は、ネイティブの promise とほぼ同じように (完全ではありませんが) 動作します。

代わりにこれを行います:

$.getJSON(url1, params1).then(function(result)){
  return $.getJSON(url2, params2);
}).then(function(result)){
  //result 2
});

さらに、jQuery を使用しています。promise を使用した jQuery AJAX は、次のように実行できます。

$.getJSON(url1, params1).then(function(result){
  // do stuff
});

複数の promise をリッスンするには、jQuery で次のようにします。

$.when($.getJSON(...), $.getJSON(...)).then(function(res1, res2){
  // do stuff
});
于 2015-07-08T20:48:12.273 に答える