運命のピラミッドを避けながら、JS Promisesを使用して2つのJQuery非同期呼び出しをチェーン化するにはどうすればよいですか? 私は "JQuery"約束をこのような本物の約束に変えることができることを知っています:
Promise.resolve($.getJSON(url, params));
もしただ約束を待っていたいなら、私はこれをすることができます:
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
});
しかし、もし私が1つのコールがもう1つのコールの後に来るようにしたいのであれば、これはうまくいきません。
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()と呼びたいと思っています。これを行う慣用方法は何ですか?
回答:
回答№1の場合は3return Promise.resolve($.getJSON(url2, params2));
あなたがしたことは、既に解決された約束を作成することでした(経由 Promise.resolve
)その解決された値がの結果である約束 $.get()
これもまた約束です。これは、「2番目の通話が終了するのを待たずに」、「結果は約束です」という理由です。
また、jQueryのAJAXコールが約束を返すときに、それらを呼び出す必要はありません.jQueryの約束は、ネイティブの約束とほぼ同じですが、完全には同じではありません。
代わりにこれを行う:
$.getJSON(url1, params1).then(function(result)){
return $.getJSON(url2, params2);
}).then(function(result)){
//result 2
});
さらに、jQueryを使用しています.jQuery AJAXは次のように約束しています:
$.getJSON(url1, params1).then(function(result){
// do stuff
});
jQueryでは、複数の約束を聞くことができます。
$.when($.getJSON(...), $.getJSON(...)).then(function(res1, res2){
// do stuff
});