如何改变承诺链?

时间:2015-10-03 04:10:19

标签: javascript jquery promise jquery-deferred

在承诺链中有没有办法让其中一个成员向链中添加承诺?

这段代码更好地说明了我的意思:

$.ajax(......).then(function(r){

  .....
  return r;

}).then(function(r){

  var d = $.Deferred();
  // how to add d.promise() to this chain ?
  ....
  return r;

}).then(function(r){

  // this function should be able to receive "r"
  // but should also wait for the promise above to complete :(

  ....
});

2 个答案:

答案 0 :(得分:1)

我没有太多使用jQuery承诺的经验,但绝对可以与另一个承诺,就像Nicolas Bevacqua在这篇Ponyfoo文章ES6 Promises in Depth中解释它一样。

var p = Promise.resolve()
  .then(data => new Promise(function (resolve, reject) {
    setTimeout(Math.random() > 0.5 ? resolve : reject, 1000)
  }))

p.then(data => console.log('okay!'))
p.catch(data => console.log('boo!'))

我希望你可以根据自己的需要调整它,或者使用原生承诺。

答案 1 :(得分:1)

要从r返回.then(),请在.resolve() r函数中使用$.Deferred()参数beforeStart,从d.promise()返回.then() r的{​​{1}}可以在链中的下一个.then()访问

 .then(function(r) {

  .....
    var d = $.Deferred(function(dfd) {
      // do stuff
      dfd.resolve(r)
    });
    // how to add d.promise() to this chain ?
    ....
    return d.promise();
 })

$.when(1).then(function(r) {
  return r;
}).then(function(r) {

  var d = $.Deferred(function(dfd) {
    
    // do stuff
    setTimeout(function() {
      dfd.resolve(r)
    }, Math.random() * 2500)
  });
  // how to add d.promise() to this chain ?
  //....
  return d.promise();
})
.then(function(r) {
  console.log(r)
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>