我有返回promises的函数列表。我希望它们按顺序运行,直到至少其中一个结算。如果其中一个人解决了所有其他人,就不应该被执行。
算法应如下:
运行第一个函数,如果它使用返回值解析退出,否则运行第二个函数,如果它解析退出并返回值,依此类推。
有可能通过承诺实现这一目标吗?我正在使用Bluebird库。
.run(getUserFromFileById(id))
.run(getUserFromFileByEmail(email))
.run(getUserFromDatabaseById(id))
.run(getUserFromDatabaseByEmail(email))
// ...
.gotResult(function (user) {
console.log('We have user!');
})
.allFailed(function () {
console.log('No joy!');
})
答案 0 :(得分:2)
仔细研究一下,这不是最好的方法
假设所有 功能解决以下解决(如果可以)或解析为 falsey ( false,&#39 ;',null,undefined,0 等)如果他们不能,不拒绝/抛弃未找到用户
getUserFromFileById(id).then(function(user) {
return user || getUserFromFileByEmail(email)
}).then(function(user) {
return user || getUserFromDatabaseById(id)
}).then(function(user) {
return user || getUserFromDatabaseByEmail(email)
}).then(function(user) {
if (user) {
console.log('woot got user');
}
else {
console.log('no user');
throw 'no user';
}
}).catch(function(fail) {
console.log('something went wrong');
});
看了之后,这种方式更有意义
这假定您的功能解决 用户,否则拒绝承诺 - 我认为这通常更有意义吗?没有?
getUserFromFileById(id).catch(function() {
return getUserFromFileByEmail(email);
}).catch(function() {
return getUserFromDatabaseById(id);
}).catch(function() {
return getUserFromDatabaseByEmail(email);
}).then(function(user) {
console.log('woot got user', user);
}, function(fail) {
console.log('something went wrong', fail);
});