Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用Bluebird Promises以延迟的方式迭代元素?_Javascript_Promise_Bluebird - Fatal编程技术网

Javascript 如何使用Bluebird Promises以延迟的方式迭代元素?

Javascript 如何使用Bluebird Promises以延迟的方式迭代元素?,javascript,promise,bluebird,Javascript,Promise,Bluebird,到目前为止,我的代码是: Promise.map startEndTimes, (startEndTime) -> Promise.delay 10000 .then -> oandaClient.getCandlesAsync "#{dbInstrument.base}_#{dbInstrument.quote}", startEndTime.startTime, startEndTime.endTime, 'S5' .then (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.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.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
函数的作用,该函数允许您限制同时挂起的承诺数量。传递
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
立即调用所有元素的回调,然后等待所有承诺

您似乎在寻找
map
函数的作用,该函数允许您限制同时挂起的承诺数量。传递
1
将使其按顺序处理数组:

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

蓝鸟什么都有,不是吗+1对于很多事情,是的:-)我见过一些不那么容易管理的事情,但它们非常罕见。蓝鸟的每件事都有它的特点,不是吗+1对于许多事情,是的:-)我见过一些事情不那么容易管理,但它们非常罕见。