【问题标题】:How to yield multiple promises in for loop with vo.js?如何使用 vo.js 在 for 循环中产生多个承诺?
【发布时间】:2017-04-19 06:02:15
【问题描述】:

基于这个例子 - vo/examples/9-pipeline-composition.js,我将如何 return yield 为这个 for 循环的每次迭代做出承诺?

此时循环运行一次并产生一个承诺。

 function * get (urls) {
    for (var i = urls.length - 1; i >= 0; i--) {
        console.log(urls[i])
        return yield http.get(urls[i]) 
    }
}

function status (res, params) {
    return res.status
}

let scrape = vo(get(['http://standupjack.com', 'https://google.com']), status)

vo([ scrape ])
.then(out => console.log('out', out))
.catch(e => console.error(e))

【问题讨论】:

    标签: javascript node.js for-loop promise flow-control


    【解决方案1】:

    当你在 for 循环中执行 return 时,循环会中断并返回结果,并且循环不会向前移动。您可以在 for 循环中调用一个函数来处理结果而不返回它。

    function * get (urls) {
      for (var i = urls.length - 1; i >= 0; i--) {
        console.log(urls[i])
        let result = yield http.get(urls[i])
        yield handleResult(result)
      }
    }
    

    Orelse 你可以将每个结果推送到一个数组中,然后在最后一起返回所有结果

    function * get (urls) {
      let resArr = []
      for (var i = urls.length - 1; i >= 0; i--) {
        console.log(urls[i])
        let result = yield http.get(urls[i])
        resArr.push(result)
      }
      return resArr
    }
    

    【讨论】:

      猜你喜欢
      • 2023-03-17
      • 2020-05-14
      • 2015-12-18
      • 2015-03-23
      • 2018-03-13
      • 1970-01-01
      • 1970-01-01
      • 2017-07-26
      • 2016-10-11
      相关资源
      最近更新 更多