如何使用 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
到目前为止我的代码是:
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