Arrays Can循环通过一个函数;“太快了”;打破它(Node.js)

Arrays Can循环通过一个函数;“太快了”;打破它(Node.js),arrays,node.js,for-loop,accumulate,Arrays,Node.js,For Loop,Accumulate,我试图在服务器上累积API响应,并将它们作为单个对象返回给客户端。为此,我循环遍历数组中的项,并将响应映射回原始对象。这对于长度为1的数组来说效果很好,但在较大的数组中循环时会记录空白 在数组中循环时,节点是否创建函数的新实例,或者即使尚未返回值,它是否仍将数据传递到同一个函数中 loopThroughArray(req, res) { for(let i=0; i<req.map.length; i++) { stack[i] = (callback) => {

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

在数组中循环时,节点是否创建函数的新实例,或者即使尚未返回值,它是否仍将数据传递到同一个函数中

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)
  })
}

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

循环等待其内部的方法完成,然后再返回。因此,除非您使用的是“线程化”,否则实际上不存在运行速度非常快的循环。

api调用是异步的

当运行循环时,代码会在不等待答案的情况下进行许多rest调用

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

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


您没有发送任何回拨。为了更清楚,我更新了问题。这是错误的。Rest调用是使用节点异步的。循环并不等待主体完成callin简单术语,而是同时运行两个循环。我有一个与递归同步的代码版本,但我试图通过使其更并行来加速它。节点本质上是异步的@matthew。您应该尽可能避免在节点中进行同步调用该函数不返回json,因为它是异步的。您可以使用回调读取api调用返回的json值,
getApi
函数体中的
console.log
是否同步运行?@EvanBechtol Yes。。。我试图改进代码,但不确定为什么函数没有按预期返回JSON对象。
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)
    }
  })