首页 > 解决方案 > 可以循环通过“太快”的函数破坏它(Node.js)

问题描述

我正在尝试在服务器上累积 API 响应并将它们作为单个对象返回给客户端。为此,我循环遍历数组中的项目并将响应映射回原始对象。这适用于长度为 1 的数组,但在循环较大数组时会记录空白。

循环遍历数组时,Node 是否会创建函数的新实例,还是会继续将数据传递给同一个函数,即使它还没有返回值?

loopThroughArray(req, res) { 
  for(let i=0; i<req.map.length; i++) {
    stack[i] = (callback) => {
      let data = getApi(req, res, req.map[i], callback)
    }
  }

  async.parallel(stack, (result) => {
      res.json(result)
  })
}

……

function getApi(req, res, num, cb) {
  request({
    url: 'https://example.com/api/' + num
  },
  (error, response, body) => {
    if(error) {
      // Log error
    } else {
      let i = {
        name: JSON.parse(body)['name'],
        age: '100'
      }
      console.log(body) // Returns empty value array.length > 1 (req.map[i])
      cb(i)
    }
  })

如果 Node 正在重载该函数,我如何确保在再次运行该函数之前已接收到数据?

标签: arraysnode.jsfor-loopaccumulate

解决方案


api 调用是异步的。

运行循环时,代码会在不等待答案的情况下进行多次休息调用。

如果循环不是太大,那么您可以使用递归来同步调用。

您还可以使用灵活的方式同步调用:

http://caolan.github.io/nimble/


推荐阅读