如何使用JS Promises进行链式两个JQuery异步调用,同时避免厄运的金字塔? 我知道我可以转换一个" JQuery"承诺这样一个真正的承诺:
Promise.resolve($.getJSON(url, params));
如果我只想等待一个承诺,我可以这样做:
Promise.resolve($.getJSON(url1, params1))
.then(function(result){
// do stuff
});
如果我想等待两个不同的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()。功能。这样做的惯用方法是什么?
答案 0 :(得分:3)
return Promise.resolve($.getJSON(url2, params2));
你所做的是创建一个已经解决的承诺(通过Promise.resolve
)承诺,其解析值是$.get()
的结果,这也是一个承诺。这就是为什么“它甚至不等待第二次完成电话”和“结果是一个承诺”。
此外,您不需要在返回promise时包装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中可以通过这种方式监听多个promise:
$.when($.getJSON(...), $.getJSON(...)).then(function(res1, res2){
// do stuff
});