【问题标题】:Function returning before jQuery promise within promise is resolved在 promise 中的 jQuery promise 之前返回的函数被解析
【发布时间】:2022-01-03 16:29:52
【问题描述】:

我有一个调用dealCardSelectableAI() 的函数,它设置了许多jQuery 延迟承诺。然后从其中调用函数setCardName()。一旦两个函数都完成了它们的任务saveGame(),就会被触发。

一切正常,除了setCardName() 在触发saveGame() 之前没有完成。 deferredQueue.push(setCardName(system, result)); 似乎没有按我的预期运行。我不知道哪里出了问题或如何解决问题。

var setCardName = function (system, card) {
  var deferred = $.Deferred();

  require(["cards/" + card[0].id], function (data) {
    var cardName = loc(data.summarize());
    system.star.ai().cardName = ko.observable(cardName);
    deferred.resolve();
  });
  return deferred.promise();
};

var dealCardSelectableAI = function (win, turnState) {
  var deferred = $.Deferred();

  // Avoid running twice after winning a fight
  if (!win || turnState === "end") {
    var deferredQueue = [];

    _.forEach(model.galaxy.systems(), function (system, starIndex) {
      if (
        model.canSelect(starIndex) &&
        system.star.ai() &&
        system.star.ai().treasurePlanet !== true
      ) {
        deferredQueue.push(
          chooseCards({
            inventory: inventory,
            count: 1,
            star: system.star,
            galaxy: game.galaxy(),
            addSlot: false,
          }).then(function (result) {
            deferredQueue.push(setCardName(system, result));
            system.star.cardList(result);
          })
        );
      }
    });

    $.when(deferredQueue).then(function () {
      deferred.resolve();
    });
  } else {
    deferred.resolve();
  }

  return deferred.promise();
};

dealCardSelectableAI(false).then(saveGame(game, true));

【问题讨论】:

  • 您正在调用保存游戏,它返回的内容设置为 then。当 then 被触发时它不会调用 saveGame。
  • deferredQueue.push(setCardName(system, result)); 是异步执行的,$.when 不会考虑。相反,使用承诺链
  • promise 链是否需要存在于chooseCards() 链中,或者被链接到dealCardSelectableAI() 调用?

标签: javascript jquery jquery-deferred


【解决方案1】:

您的代码显示调用 saveGame() 并且从函数调用返回的内容应设置为 then。并不是说“完成后调用 saveGame”

dealCardSelectableAI(false).then(function () { saveGame(game, true) });

【讨论】:

  • 啊!真是个笨蛋。谢谢!
猜你喜欢
  • 2018-12-29
  • 2019-05-28
  • 2019-08-01
  • 2021-06-03
  • 2015-10-17
  • 2021-09-03
  • 2021-11-28
  • 1970-01-01
  • 2020-12-02
相关资源
最近更新 更多