javascript - 按顺序运行列表中的函数,直到一个函数解析为止

标签 javascript node.js promise bluebird

我有返回 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/

相关文章:

node.js - express 4 : Storing db instance

node.js - mongodb nodejs 每个 vs toArray

node.js - 使用 Mocha 测试 Express : a promise-based test will not run by itself?

javascript - 根据跨度值在页面加载时启用输入文本

javascript - 如何更改 highcharts 饼图的颜色?

javascript - lastChild 的 getBoundingClientRect().x

javascript - 首先: setTimeout 0 or await Promise.解析会发生什么?

javascript - 更新behaviorsubject中的特定元素,或者只订阅一次

javascript - 如何使用不同的 URL 调用 2 个不同的模块。服务器继续发送第二个请求的第一个模块结果

javascript - 通过 ajax 调用在 componentDidMount 中正确设置测试状态