【问题标题】:Correct way to chain two promises when the second promise depends on the first?当第二个承诺依赖于第一个承诺时,链接两个承诺的正确方法是什么?
【发布时间】:2015-09-26 23:44:55
【问题描述】:

如何使用 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”函数中构造的 promise 上调用 .then()。这样做的惯用方法是什么?

【问题讨论】:

  • result 周围多了两个右括号

标签: javascript jquery es6-promise


【解决方案1】:
return Promise.resolve($.getJSON(url2, params2));

您所做的是创建一个已经解决的承诺(通过Promise.resolve),其解决的值是$.get() 的结果,这也是一个承诺。这就是为什么“它甚至不等待第二次调用完成”和“结果是一个承诺”。

此外,您不需要包装 jQuery AJAX 调用,因为它们返回承诺。 jQuery 的 Promise 的行为几乎(但不完全)与原生 Promise 相同。

改为这样做:

$.getJSON(url1, params1).then(function(result)){
  return $.getJSON(url2, params2);
}).then(function(result)){
  //result 2
});

此外,您正在使用 jQuery。带有 promise 的 jQuery AJAX 可以这样完成:

$.getJSON(url1, params1).then(function(result){
  // do stuff
});

在 jQuery 中可以通过这种方式监听多个 Promise:

$.when($.getJSON(...), $.getJSON(...)).then(function(res1, res2){
  // do stuff
});

【讨论】:

  • result2 还不是承诺,不是第二次 getJSON 调用的响应吗?
  • @user3928094 没有。我正在返回一个用 AJAX 结果解决的承诺。你所做的是返回一个以承诺解决的承诺。
  • 那么为什么 Promise.resolve($.ajax(url, params)).then() 工作?从某种意义上说,它也是一个用一个承诺解决的承诺......有没有办法做我正在做的标准 EMCA 承诺,完全避开 jquery 承诺?
  • @user3928094 对于任何后续问题,请提出另一个问题。 meta.stackoverflow.com/q/266767/575527。我相信“为什么从then 返回时,为什么返回一个承诺解决的承诺不起作用?”和“如何完全避开 jQuery 承诺?”是你的后续行动。
猜你喜欢
  • 2021-02-18
  • 2014-11-11
  • 1970-01-01
  • 2017-12-21
  • 1970-01-01
  • 2013-11-25
  • 2019-12-07
  • 2017-10-09
  • 1970-01-01
相关资源
最近更新 更多