我发现各种 Deferred/promise 库的文档通常涵盖非常简单的用例,例如链接 1 或 2 个函数/方法并导致解决或拒绝成功或错误。
然而,当涉及到更复杂的用例(超过 5 个函数/方法的链;嵌套的 Deferreds;从其他 Deferreds 中返回 Promise)时,我会空手而归,变得非常沮丧。
比如说,我有一个包含 2 个嵌套函数的函数。每个子函数都返回一个承诺,我希望父函数返回子函数的成功/失败结果:
var saveUser = function(user) {
var saveNewUser = function(user) {
var deferred = when.defer();
user.save(function (err) {
if (err) {
deferred.reject();
}
else {
// forcing a rejection here for testing purposes
deferred.reject(6);
}
});
return deferred.promise;
}
var supplyUserCollections = function() {
var deferred = when.defer();
deferred.reject();
return deferred.promise;
}
return saveNewUser(user).then(supplyUserCollections(), function() {
console.log('failed to save new user');
}).then(function(data) {
console.log('succeeded to do everything');
}, function() {
console.log('failed to seed new user collections');
});
}
这不起作用;奇怪的是,“成功完成所有事情”console.log
会触发,即使我强制拒绝/失败两个子函数。看到 a 上的第一个参数.then
是成功案例,我真的不明白为什么会这样。此外,假设父函数saveUser
是另一个广泛的承诺链的一部分,例如:
dropExistingCollections(collections).then(saveEntities(albums), function() {
console.log('failed to drop existing collections');
}).then(saveEntities(movies), function() {
console.log('failed to save all albums');
}).then(saveEntities(games), function() {
console.log('failed to save all movies');
}).then(saveUsers(users), function() {
console.log('failed to save all games');
}).then(function(data) {
console.log(data);
console.log('successfully saved all seed data');
res.send('database data wiped and re-seeded');
}, function() {
console.log('failed to save all users');
});
我不太确定如何以一种saveUser
与其他函数链接的方式正确地返回一个承诺,这些函数都是返回已解决/拒绝的延迟的简单函数。
我真的很想更清楚地说明应该如何处理这些更复杂的延迟/承诺用例。这显然是一个非常密集的话题,而且我发现的大部分材料都不是特别能引起我的共鸣。