一个一个地执行承诺

时间:2017-01-24 21:41:56

标签: javascript jquery

我有一个需要按顺序执行的test_func,即; first_call,second_call,third_call。

当前输出: -

started == first_call
VM81:49 status in : first_call  pending
VM81:47 started == second_Call
VM81:47 started == third_Call
VM81:49 status in : second_Call  pending
VM81:49 status in : third_Call  pending


function test_func(call_from){
  var deferred = $.Deferred();
    console.log('started ==',call_from)
  setTimeout(function(){
    console.log("status in :",call_from + '  ' +  deferred.state());
    deferred.resolve();
  },5000);

  return deferred.promise();
};
test_func('first_call').then(function(){
    test_func('second_Call')
  }).then(function(){
    test_func('third_Call')
  })

https://jsfiddle.net/44Lm3at0/

1 个答案:

答案 0 :(得分:6)

确保您使用PromisePromise链中的每个return下游发送,例如:

test_func('first_call')
  .then(function(){
    return test_func('second_Call');
  })
  .then(function(){
    return test_func('third_Call');
  })
  .then(function() {
     console.log('done');
   });

并且看到更新的js小提琴来证明它: https://jsfiddle.net/44Lm3at0/1/

要添加,如果您不return Promise,则链中的每个项目将并行运行(偏移一点时间)而不是顺序运行。通过返回它们,您通知JavaScript您想要等待"让Promise完成,允许then链正常工作。