运行 从列表中按顺序运行,直到一个解决

Run functions from the list sequentially until one resolves

我有 returns 承诺的功能列表。我希望它们依次 运行 直到至少其中一个解决。如果其中之一解决了所有其他问题,则不应执行。

算法应该如下:

运行 第一个函数,如果它用返回值解析退出,否则 运行 第二个函数,如果它用返回值解析退出,依此类推。

是否可以通过承诺来实现?我正在使用 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, undefined, 0 等) 如果他们不能,不要 reject/throw找不到用户

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');
});

看了下,这样比较有道理

这假设你的功能 resolve a user otherwise reject the 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);
});