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

My promise is resolving before I think it should

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

主要顺序是首先尝试一些 "main" 应该异步完成的工作,然后做一些 "follow-up" 本身包含一组几个异步请求的工作。这是我的 fiddle 的主体,演示了这个问题:

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;
}

我的直接问题是下一项的 "main" 工作在某项的 "follow-up" 工作完成之前开始。我猜我只是没有正确处理承诺,不小心过早地解决了它,但我现在不知道如何。

我创建了一个 fiddle 来模拟我的问题。在其中,我看到 "two" 工作项的工作在 "one" 的后续工作完成之前开始。我如何确保在开始下一个主要工作之前完成每个项目的跟进?

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

将您的 dofollowup 修改为 return 延迟似乎可以解决此问题。

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;

}