顺序运行列表中的函数,直到一个结算

时间:2015-09-06 11:09:48

标签: javascript node.js promise bluebird

我有返回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!');
})

1 个答案:

答案 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);
});