javascript - 当第二个 promise 取决于第一个时,链接两个 promise 的正确方法?

标签 javascript jquery es6-promise

如何使用 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/

相关文章:

javascript - jqgrid密码字段不仅在编辑模式

jquery - .attr() 相关的东西在 jquery 升级 1.3.2 到 1.6.4 后停止工作,还有什么可以破坏的?

javascript - 为什么我的无限循环在异步函数中时会阻塞?

javascript - react 时间游戏

javascript - 使用一个按钮完成向下滚动时向上滚动一个div

javascript - 调整整列的大小

javascript - BigCommerce:如何创建自定义过滤器?

javascript - 如果循环未在给定时间内完成,如何打破 "for await ...of"循环?

javascript - 为什么我不能将其放入 Promise.catch 处理程序中?

javascript - 使用 json feed 和传递的数据在 Angular 中获取正确的记录