我有返回 promise 的函数列表。我希望它们按顺序运行,直到至少其中一个解决。如果其中之一解决了,那么所有其他的都不应被执行。
算法应如下:
运行第一个函数,如果它解析退出并返回值,否则运行第二个函数,如果它解析退出并返回值,依此类推。
通过 promise 可以实现这一目标吗?我正在使用 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!');
})
最佳答案
仔细观察,这不是最好的方法
假设用户可以解析下面的所有您函数,或者解析为falsey(false、''、 null,未定义,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');
});
看了下,这种方式更有意义
这假设您的函数解决一个用户,否则拒绝 promise - 我认为这通常更有意义?没有?
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);
});
关于javascript - 按顺序运行列表中的函数,直到一个函数解析为止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32422887/