node.js - 从回调中设置全局变量

标签 node.js asynchronous node-modules

首先,我需要使用“请求”来获取数据,然后将响应添加到变量firstData:

var request = require('request');
let firstData,otherData = '';
request({
    url: 'https://someurl.extension/get/data',
    method: "POST",
    json: true,
    body: {}
  },(error, response) => {
   firstData = response;
  })

然后我发出另一个请求来获取 otherData 的值:

request({
    url: 'https://someurl.extension/get/otherdata',
    method: "POST",
    json: true,
    body: {}
  },(error, response) => {
   otherData = response;
  })

然后将它们渲染为 res.json({firstData,otherData}) 但什么也没有出现,因为异步不能做到这一点。有人说应该通过“回调”来完成,但是如果我需要发出 5 个或更多请求怎么办?会有5个回调,代码不再美观。 有什么办法可以做到这一点吗?或者有什么方法可以响应全局变量?类似reactjs中的setState()。 谢谢。

最佳答案

您可以 promise 请求或仅使用request-promise ,然后使用async/await

const request = require('request-promise');

app.get('/some-route', async(req, res) => {
                      // ^^ Notice async keyword
    try {

        const firstData = await request({
            url: 'https://someurl.extension/get/data',
            method: "POST",
            json: true,
            body: {}
        });

        const otherData = await request({
            url: 'https://someurl.extension/get/otherdata',
            method: "POST",
            json: true,
            body: {}
        });

        res.json({
            firstData,
            otherData
        })

    } catch (e) {
        res.status(500);
        res.send('Error');
    }

});

如果你可以并行执行请求(如果它们不相互依赖),你可以使用Promise.all

const [firstData, secondData] = await Promise.all([
     request(/* first request options  */),
     request(/* second request options */)
]);

关于node.js - 从回调中设置全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50936503/

相关文章:

javascript - 在 while 循环中使用异步函数时会卡住 (scraperjs)

node.js - 如何在 node.js 中跨多个文件拆分类定义?

javascript - 如何下载远程图像然后将图像作为图像文件上传以进行表单提交?

webpack - 在 Next.js 中编译 npm 模块

node.js - 在没有 Node 的情况下使用 Jade 模板的简单方法?

node.js - socket.io socket.set 和 socket.get - 什么是回调参数?

node.js - 使用 WebRTC.io 和 NodeJS 到达时连接到房间

c# - 任务完成时运行函数

c# - 如何回答请求但继续处理 WebApi 中的代码

node.js - 使用 Sequelize 时是否需要清理用户输入?