当第二个承诺取决于第一个承诺时,正确的方式来链接两个承诺?

时间:2015-07-08 20:40:42

标签: javascript jquery es6-promise

如何使用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()。功能。这样做的惯用方法是什么?

1 个答案:

答案 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
});