当第二个承诺取决于第一个时,链接两个承诺的正确方法?
Correct way to chain two promises when the second promise depends on the first?
如何使用 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() 。执行此操作的惯用方法是什么?
return Promise.resolve($.getJSON(url2, params2));
您所做的是创建一个已解析的承诺(通过 Promise.resolve
),其解析值是 $.get()
的结果,这也是一个承诺。这就是 "it doesn't even wait for the second call to finish" 和 "the result is a promise".
的原因
此外,您不需要像 return 承诺的那样包装 jQuery AJAX 调用。 jQuery 的承诺几乎(但不完全)与原生承诺相同。
改为这样做:
$.getJSON(url1, params1).then(function(result)){
return $.getJSON(url2, params2);
}).then(function(result)){
//result 2
});
此外,您正在使用 jQuery。 jQuery AJAX 使用 promises 可以这样做:
$.getJSON(url1, params1).then(function(result){
// do stuff
});
在jQuery:
中可以这样监听多个promise
$.when($.getJSON(...), $.getJSON(...)).then(function(res1, res2){
// do stuff
});
如何使用 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() 。执行此操作的惯用方法是什么?
return Promise.resolve($.getJSON(url2, params2));
您所做的是创建一个已解析的承诺(通过 Promise.resolve
),其解析值是 $.get()
的结果,这也是一个承诺。这就是 "it doesn't even wait for the second call to finish" 和 "the result is a promise".
此外,您不需要像 return 承诺的那样包装 jQuery AJAX 调用。 jQuery 的承诺几乎(但不完全)与原生承诺相同。
改为这样做:
$.getJSON(url1, params1).then(function(result)){
return $.getJSON(url2, params2);
}).then(function(result)){
//result 2
});
此外,您正在使用 jQuery。 jQuery AJAX 使用 promises 可以这样做:
$.getJSON(url1, params1).then(function(result){
// do stuff
});
在jQuery:
中可以这样监听多个promise$.when($.getJSON(...), $.getJSON(...)).then(function(res1, res2){
// do stuff
});