到目前为止我的代码是:
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获取数据,然后处理这些数据。我不想立即启动所有呼叫,而是让它们顺序启动。这可能吗?如果是这样,我该怎么做?
答案 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