Bluebird:运行promise返回函数序列

Bluebird: Run sequence of promise-returning functions

本文关键字:函数 返回 promise 运行 Bluebird      更新时间:2023-09-26

运行动态生成的函数序列的最简洁方法是什么,其中每个函数都返回一个Promise,必须在下一个函数运行之前解析该Promise?

例如:

// Assume the following 'process' functions are generated elsewhere
function process_1 (input) {
    return new Promise(function (resolve, reject) {
        resolve(input + '_1');
    });
}
function process_2 (input) {
    return new Promise(function (resolve, reject) {
        resolve(input + '_2');
    });
}
function process_3 (input) {
    return new Promise(function (resolve, reject) {
        resolve(input + '_3');
    });
}
// We can construct a sequence of these functions,
// but each one still needs to be 'configured' with a value
// before it can return it's promise.
var process = [process_1, process_2, process_3]

Bluebirds Promise上可用的收集方法(例如alleach等)似乎处理的集合,而不是promise生成函数的集合。

如果我试图将序列映射或缩减为承诺序列,而不是函数序列,那么我就失去了将一个承诺的结果传递到下一个承诺中的能力?

您可以为此使用reduce:

bluebird.reduce( [process_1, process_2, process_3], function ( input, next ) {                                                                                                                                     
    return next( input );
}, 'INPUT' ).then( function ( result ) { 
    console.log( result );
} );

注意:您还缺少process_2process_3的输入参数,必须添加该参数才能正常工作。

function process_1 (input) {
    return new Promise(function (resolve, reject) {
        resolve(input + '_1');
    });
}
function process_2 ( input ) {
    return new Promise(function (resolve, reject) {
        resolve(input + '_2');
    });
}
function process_3 ( input ) {
    return new Promise(function (resolve, reject) {
        resolve(input + '_3');
    });
}
bluebird.reduce( [process_1, process_2, process_3], function ( input, next ) {
    return next( input );                                                                                                                                                                                          
}, 'INPUT' ).then( function ( result ) {
    console.log( result );
} );
// INPUT_1_2_3

这里有一种非蓝鸟特定的替代方法:

var p = arrayOfFns.reduce((p, c) => p.then(c), Promise.resolve('INPUT'));
p.then(console.log);