在 jQuery promise 中的 promise 之前返回的函数已解决
Function returning before jQuery promise within promise is resolved
我有一个调用 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));
您的代码说调用 saveGame() 并且从函数调用返回的内容应该设置为 then。这并不是说,“完成后调用 saveGame”
dealCardSelectableAI(false).then(function () { saveGame(game, true) });
我有一个调用 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));
您的代码说调用 saveGame() 并且从函数调用返回的内容应该设置为 then。这并不是说,“完成后调用 saveGame”
dealCardSelectableAI(false).then(function () { saveGame(game, true) });