如何使用 Bluebird Promises 延迟遍历元素?

How can I iterate through elements with a delay using Bluebird Promises?

到目前为止我的代码是:

  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 获取数据,然后处理该数据。我不想一次启动所有呼叫,而是让它们按顺序启动。这可能吗?如果可以,我该怎么做?

如果你想 运行 按顺序使用 promise,你可以使用 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

您的延迟 运行 都是并行的,因为 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