【问题标题】:My promise is resolving before I think it should我的承诺在我认为应该解决之前就解决了
【发布时间】:2017-09-09 04:55:12
【问题描述】:

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

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

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

我的直接问题是下一个项目的“主要”工作是在一个项目的“后续”工作完成之前开始的。我猜我只是没有正确处理承诺并且不小心过早地解决了它,但我现在不知道如何。

我创建了一个模拟我的问题的小提琴。在其中,我看到“二”工作项的工作在“一”的后续工作完成之前开始。如何确保在开始下一个主要工作之前完成每个项目的后续工作?

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

【问题讨论】:

  • 你忘记在你的 dofollowup 中返回你的 deferred 承诺。IOW:你创建了一个 deferred 但从未返回它。

标签: javascript promise q


【解决方案1】:

修改你的 dofollowup 以返回 deferred 似乎可以解决这个问题。

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;

}

【讨论】:

  • 好的,谢谢。这绝对是我小提琴中问题的原因。这现在看起来很明显,但不幸的是现在它似乎并没有模仿我失败的主要应用程序。也许我忘记从我这样的一个链式函数中返回承诺。回到挖掘!
猜你喜欢
  • 2015-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-23
  • 2019-04-13
  • 2021-06-29
  • 1970-01-01
  • 2015-07-18
相关资源
最近更新 更多