我的承诺是在我认为应该解决之前解决的

时间:2017-09-08 19:58:47

标签: javascript promise q

我正在尝试使用q promises来处理一些长时间运行的ajax请求和后续数据处理。我有一个案例,我试图创建一些应该按顺序执行的承诺,但它们似乎在我想要之前解决,我不知道为什么。

主要的顺序是首先尝试一些" main"应该异步完成的工作,然后做一些"跟进"工作本身包含一组几个异步请求。这是我小提琴演奏问题的主体:

var to_do = ["one", "two", "three", "four"];
var result = Q();
to_do.forEach(function (item) {
  result = result
    .then(dowork.bind(null, item))
    .fail(handleError)
    .then(dofollowup.bind(null, item));
});

var dowork = function (value) {
  var deferred = Q.defer();
  log("About to do main work for " + value);
  setTimeout(function () {
    if (value === 'two') {
      // represent a possible error in this work, but we still need to do follow-up work
      deferred.reject("An error occurred doing work for number two, but we should continue");
    } else {
      log("Done main work for " + value);
      deferred.resolve(value);    
    }
  }, 1000);
  return deferred.promise;
}

var dofollowup = function (value) {
  log("Doing follow-up work for " + value);
  var to_do = Q();
  for (var i=0; i<5; i++) {
    to_do = to_do.then(function () {
      var deferred = Q.defer();
      setTimeout(function () {
        log("Doing delayed work for " + value);
        deferred.resolve();
      }, 100);
    });
  }
  return to_do;
}

我当前的问题是&#34;主要&#34;在&#34;跟进&#34;之前开始下一个项目的工作。完成项目的工作。我猜我只是没有正确处理承诺并且很快就意外地解决了,但我现在还不知道如何。

我创造了一个模拟我的问题的小提琴。在其中,我看到了&#34;两个&#34;工作项目在后续行动开始之前为&#34;一个&#34;完成了。我怎样才能确保在开始下一个主要工作之前完成每个项目的后续工作?

https://jsfiddle.net/cfarmerga/cp323djx/1/

enter image description here

1 个答案:

答案 0 :(得分:2)

修改你的dofollowup以返回延迟似乎解决了这个问题。

var dofollowup = function (value) {

  log("Doing follow-up work for " + value);

  var to_do = Q();
  for (var i=0; i<5; i++) {
    to_do = to_do.then(function () {
      var deferred = Q.defer();
      setTimeout(function () {
        log("Doing delayed work for " + value);
        deferred.resolve();
      }, 100);
      return deferred.promise; //you forgot this..
    });
  }
  return to_do;

}