在一个数组中同步链接BlueBird承诺

时间:2016-02-13 18:13:05

标签: javascript node.js promise bluebird es6-promise

我试图同时执行一系列承诺,将它们链接在一起,但只根据条件添加了某些承诺..

以下是我的意思的一个例子:

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))

如果布尔值为true,则输出为:RESULT: 4,如果为false,则为RESULT: 3,这正是我试图完成的。

我认为应该有更好,更清洁的方法来做到这一点。我正在使用Bluebird promise库,它非常强大。我尝试使用Promise.join,但没有产生预期的结果,Promise.reduce也没有(但我可能错误地做了那个)

由于

2 个答案:

答案 0 :(得分:1)

您正在链接异步功能。将承诺更多地视为回报值,而不是令人兴奋。

您可以将函数放在这样的数组中,然后过滤数组:

[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);
}

答案 1 :(得分:0)

我找到了一个很好的相关帖子here。使用相同的逻辑,我能够使这个工作:

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) )

与我原始帖子中发布的结果相同