Bluebird:运行 承诺返回函数序列
Bluebird: Run sequence of promise-returning functions
运行 动态生成函数序列的最简洁方法是什么,其中每个函数 returns 一个必须在下一个 运行 之前解决的 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
上可用的收集方法(例如 all
、each
等)似乎处理 值 的集合,而不是比承诺生成函数的集合。
如果我尝试将序列映射或缩减为一系列 promise 而不是函数,那么我将失去将一个 promise 的结果传递到下一个 promise 的能力吗?
您可以为此使用 reduce:
bluebird.reduce( [process_1, process_2, process_3], function ( input, next ) {
return next( input );
}, 'INPUT' ).then( function ( result ) {
console.log( result );
} );
注意:您还缺少 process_2
和 process_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
这是另一种 non-bluebird-specific 方式:
var p = arrayOfFns.reduce((p, c) => p.then(c), Promise.resolve('INPUT'));
p.then(console.log);
运行 动态生成函数序列的最简洁方法是什么,其中每个函数 returns 一个必须在下一个 运行 之前解决的 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
上可用的收集方法(例如 all
、each
等)似乎处理 值 的集合,而不是比承诺生成函数的集合。
如果我尝试将序列映射或缩减为一系列 promise 而不是函数,那么我将失去将一个 promise 的结果传递到下一个 promise 的能力吗?
您可以为此使用 reduce:
bluebird.reduce( [process_1, process_2, process_3], function ( input, next ) {
return next( input );
}, 'INPUT' ).then( function ( result ) {
console.log( result );
} );
注意:您还缺少 process_2
和 process_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
这是另一种 non-bluebird-specific 方式:
var p = arrayOfFns.reduce((p, c) => p.then(c), Promise.resolve('INPUT'));
p.then(console.log);