运行 从列表中按顺序运行,直到一个解决
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);
});
我有 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);
});