【发布时间】: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