如何使用 JS Promises 链接两个 JQuery 异步调用,同时避免厄运金字塔? 我知道我可以将“JQuery” promise 转换为像这样的真实 promise :
Promise.resolve($.getJSON(url, params));
如果我只想等待一个 promise ,我可以这样做:
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 :(
});
不知何故,我想在“做事”函数中构造的 promise 上调用 .then()。执行此操作的惯用方法是什么?
最佳答案
return Promise.resolve($.getJSON(url2, params2));
您所做的是创建一个已解析的 promise (通过 Promise.resolve
),其解析值是 $.get()
的结果,这也是一个 promise 。这就是为什么“它甚至不等待第二次调用完成”和“结果就是一个 promise ”。
此外,您不需要包装 jQuery AJAX 调用,因为它们会返回 promise 。 jQuery 的 promise 几乎(但不完全)与原生 promise 相同。
改为这样做:
$.getJSON(url1, params1).then(function(result)){
return $.getJSON(url2, params2);
}).then(function(result)){
//result 2
});
此外,您正在使用 jQuery。带有 promises 的 jQuery AJAX 可以像这样完成:
$.getJSON(url1, params1).then(function(result){
// do stuff
});
在 jQuery 中可以这样实现对多个 promise 的监听:
$.when($.getJSON(...), $.getJSON(...)).then(function(res1, res2){
// do stuff
});
关于javascript - 当第二个 promise 取决于第一个时,链接两个 promise 的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31303272/