如何确保在变量分配之前返回数据(Node.js)

时间:2018-08-08 16:04:26

标签: node.js asynchronous parallel-processing

我正在尝试同时在多个API端点上检索数据,并将结果汇​​总以作为一个响应发送回客户端。

但是,当尝试从async.parallel返回数据时,我得到了undefined的结果。我认为这是因为result代码在返回之前正在执行,但是我不确定。

我想将一组ID传递给服务器,获取其元数据,将其元数据合并到一个对象中,然后将单个对象发送回客户端。

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

  async.parallel(stack, (err, result) => {
    if(err) {
      // Handle error
    } else {
      console.log(result) // Logs undefined
      res.json([result])  // Would like to send this result back to the client
    }
  })
}

function subroute(req, res, num) {
  request({
    url: 'https://example.com/api/endpoint/' + num
  },
  (error, response, body) => {
    if(error) {
      res.json({ "error": error })
    } else {
      let i = {
        name: body.name,
        age: body.age,
      }
      return i 
    }
  })
}

如何在服务器上累积许多API端点响应的结果,并将其作为一个响应发送回客户端?

1 个答案:

答案 0 :(得分:1)

更改

let data = subroute(req, res, req.map[i])
callback(null, data)

subroute(req, res, req.map[i], callback)

随后,更改子路由以接收回调并返回return

function subroute(req, res, num, cb) {
 request({
    url: 'https://example.com/api/endpoint/' + num
  },
  (error, response, body) => {
    if(error) {
      res.json({ "error": error })
      cb(<whatever error you would want to pass>);
    } else {
      let i = {
        name: body.name,
        age: body.age,
      }
      cb(null, i);
    }
  })
}

通过执行let data = subroute(req, res, req.map[i]),您将subroute调用的结果分配给data。注意,subroute在函数主体中没有return语句,因此数据将始终为undefined