在数组中将 BlueBird promise 同步链接在一起
Synchronously chain BlueBird promises together within an array
我正在尝试同步执行一系列承诺,将它们链接在一起,但只根据条件添加某些承诺..
这是我的意思的一个例子:
const Promise = require('bluebird')
const funcA = int => new Promise( res => res(++int) )
const funcB = int => new Promise( res => res(++int) )
const funcC = int => new Promise( res => res(++int) )
let mainPromise = funcA(1)
// Only execute the funcB promise if a condition is true
if( true )
mainPromise = mainPromise.then(funcB)
mainPromise = mainPromise.then(funcC)
mainPromise
.then( result => console.log('RESULT:',result))
.catch( err => console.log('ERROR:',err))
如果布尔值为真,则输出为:RESULT: 4
,如果为假,则输出为 RESULT: 3
,这正是我想要完成的。
我认为应该有更好、更简洁的方法来执行此操作。我正在使用 Bluebird promise 库,它非常强大。我尝试使用 Promise.join
,但没有产生预期的结果,Promise.reduce
也没有(但我可能做错了)
谢谢
您正在链接 异步函数。将承诺更多地视为 return 价值,而不是那么令人兴奋。
您可以像这样将函数放在一个数组中,然后过滤该数组:
[funcA, funcB, funcC]
.filter(somefilter)
.reduce((p, func) => p.then(int => func(int)), Promise.resolve(1))
.catch(e => console.error(e));
或者,如果您只是在寻找一种更好的方式来编写序列中的条件,您可以这样做:
funcA(1)
.then(int => condition ? funcB(int) : int)
.then(funcC);
.catch(e => console.error(e));
如果您使用的是 ES7,则可以使用异步函数:
async function foo() {
var int = await funcA(1);
if (condition) {
int = await funcB(int);
}
return await funcC(int);
}
我找到了一个很好的相关线程 。使用相同的逻辑,我能够使它正常工作:
const Promise = require('bluebird')
const funcA = int => new Promise( res => res(++int) )
const funcB = int => new Promise( res => res(++int) )
const funcC = int => new Promise( res => res(++int) )
const toExecute = [funcA, funcB]
if( !!condition )
toExecute.push( funcC )
Promise.reduce( toExecute, ( result, currentFunction ) => currentFunction(result), 1)
.then( transformedData => console.log('Result:', transformedData) )
.catch( err => console.error('ERROR:', err) )
与我原来的帖子中发布的结果相同
我正在尝试同步执行一系列承诺,将它们链接在一起,但只根据条件添加某些承诺..
这是我的意思的一个例子:
const Promise = require('bluebird')
const funcA = int => new Promise( res => res(++int) )
const funcB = int => new Promise( res => res(++int) )
const funcC = int => new Promise( res => res(++int) )
let mainPromise = funcA(1)
// Only execute the funcB promise if a condition is true
if( true )
mainPromise = mainPromise.then(funcB)
mainPromise = mainPromise.then(funcC)
mainPromise
.then( result => console.log('RESULT:',result))
.catch( err => console.log('ERROR:',err))
如果布尔值为真,则输出为:RESULT: 4
,如果为假,则输出为 RESULT: 3
,这正是我想要完成的。
我认为应该有更好、更简洁的方法来执行此操作。我正在使用 Bluebird promise 库,它非常强大。我尝试使用 Promise.join
,但没有产生预期的结果,Promise.reduce
也没有(但我可能做错了)
谢谢
您正在链接 异步函数。将承诺更多地视为 return 价值,而不是那么令人兴奋。
您可以像这样将函数放在一个数组中,然后过滤该数组:
[funcA, funcB, funcC]
.filter(somefilter)
.reduce((p, func) => p.then(int => func(int)), Promise.resolve(1))
.catch(e => console.error(e));
或者,如果您只是在寻找一种更好的方式来编写序列中的条件,您可以这样做:
funcA(1)
.then(int => condition ? funcB(int) : int)
.then(funcC);
.catch(e => console.error(e));
如果您使用的是 ES7,则可以使用异步函数:
async function foo() {
var int = await funcA(1);
if (condition) {
int = await funcB(int);
}
return await funcC(int);
}
我找到了一个很好的相关线程
const Promise = require('bluebird')
const funcA = int => new Promise( res => res(++int) )
const funcB = int => new Promise( res => res(++int) )
const funcC = int => new Promise( res => res(++int) )
const toExecute = [funcA, funcB]
if( !!condition )
toExecute.push( funcC )
Promise.reduce( toExecute, ( result, currentFunction ) => currentFunction(result), 1)
.then( transformedData => console.log('Result:', transformedData) )
.catch( err => console.error('ERROR:', err) )
与我原来的帖子中发布的结果相同