在jQuery中,返回deferred和deferred.proise()有什么区别



我使用jQuery在ES5环境中工作。我有一些代码如下:

var saveGame = function (gameState, saveStars) {
var deferred = $.Deferred();
var starsSaved = saveStars ? false : true;
model.game().saved(starsSaved);
model.driveAccessInProgress(true);
GW.manifest.saveGame(gameState).then(function () {
model.driveAccessInProgress(false);
deferred.resolve();
});
return deferred; // or deferred.promise()?
};
saveGame().then(/* more stuff */);

在这种情况下,无论我返回deferred.promise()还是仅返回deferred.then都能按预期工作。考虑到这一点,我想我有点不清楚什么是承诺,我想知道这两种回报之间有什么区别,什么时候才重要?

您希望返回deferred.proise((,这样调用代码就不能调用resolve或reject或其他deferred特定的方法。这不是调用者应该访问的东西。它应该只能使用promise,而不能影响它的状态。您也可以阅读文档。

您将返回deferred.promise()

但是看起来saveGame(gameState)已经返回了Promise,所以您根本不应该在这里使用$.Deferred

var saveGame = function (gameState, saveStars) {
var starsSaved = saveStars ? false : true;
model.game().saved(starsSaved);
model.driveAccessInProgress(true);
return GW.manifest.saveGame(gameState).then(function () {
model.driveAccessInProgress(false);
});
};
saveGame().then(/* more stuff */);

已经有了Promise并使用$.Deferred创建新的Promise是一种反模式。这样做的原因是,您可能很容易忘记某些情况,并且您的代码可能会陷入这样的困境。

如果例如GW.manifest.saveGame(gameState)失败怎么办?你不考虑这种情况,所以你需要添加一个.catch:

GW.manifest.saveGame(gameState).then(function () {
model.driveAccessInProgress(false);
deferred.resolve();
})
.catch(function(err) {
deferred.resolve(err);
})

可能还有其他情况。

最新更新