如何使用Bluebird Promises延迟迭代元素?

时间:2015-02-26 17:19:24

标签: javascript promise bluebird

到目前为止我的代码是:

  Promise.map startEndTimes, (startEndTime) ->
    Promise.delay 10000
    .then ->
      oandaClient.getCandlesAsync "#{dbInstrument.base}_#{dbInstrument.quote}", startEndTime.startTime, startEndTime.endTime, 'S5'
  .then (candles) ->
    console.log candles

这不是真的有效。我有startEndTimes作为数组。我想为他们每个人从Oanda获取数据,然后处理这些数据。我不想立即启动所有呼叫,而是让它们顺序启动。这可能吗?如果是这样,我该怎么做?

2 个答案:

答案 0 :(得分:2)

如果您想按顺序运行promises,可以使用Promise.reduce()

Promise.reduce startEndTimes, (total, startEndTime) ->
    oandaClient getCandlesAsync( 
        "#{dbInstrument.base}_#{dbInstrument.quote}" 
        startEndTime.startTime
        startEndTime.endTime
        'S5'
    ).then (candles) ->
        console.log candles
        total.concat candles    
, []
.then (allCandles) ->
    # use allCandles

如果您希望在每次调用之前都按顺序运行它们,那么您也可以这样做:

Promise.reduce startEndTimes, (total, startEndTime) ->
    Promise.delay 10000
    .then () -> 
        oandaClient getCandlesAsync( 
            "#{dbInstrument.base}_#{dbInstrument.quote}" 
            startEndTime.startTime
            startEndTime.endTime
            'S5'
        )
    .then (candles) ->
        console.log candles
        total.concat candles    
, []
.then (allCandles) ->
    # use allCandles

答案 1 :(得分:2)

您的延迟正在并行运行,因为Promise.map会立即调用所有元素的回调,然后等待所有承诺。

您似乎在寻找map函数的concurrency option,它允许您同时限制待处理的承诺数量。传递1将使其按顺序处理您的数组:

Promise.map startEndTimes, (startEndTime) ->
  oandaClient.getCandlesAsync "#{dbInstrument.base}_#{dbInstrument.quote}", startEndTime.startTime, startEndTime.endTime, 'S5'
, concurrency: 1
.then (candles) ->
  console.log candles