【问题标题】:How to use Promise.all with Request in node.js?如何在 node.js 中使用 Promise.all 和 Request?
【发布时间】:2018-03-30 19:22:22
【问题描述】:

我想做一些类似的事情:

Promise.all([
    fetch(url1).then(function(response){ return response.json() }),
        fetch(url2).then(function(response){ return response.json() }),
            fetch(url3).then(function(response){ return response.json() }),
                fetch(url4).then(function(response){ return response.json() })
    ]).then(allResponses => {

    var data1 = allResponses[0];
    var data2 = allResponses[1];
    var data3 = allResponses[2];
    var data4 = allResponses[3];

    // process data....

    });

以上是 React.js 代码,我想做同样的事情,但在服务器上使用 Node.js。问题是我没有获取,我有请求(我什至应该使用请求吗?)。 https://github.com/request/request 就是这样用的……

var request = require('request');

request(url1, function (error, response, body) {
});

但是我如何将 request 与 Promise.all 一起使用?因为我想获取多个东西,并且只在所有都完成但在 Node 中处理它们,我宁愿不使用一堆回调。

【问题讨论】:

  • 你也可以随时在节点上安装 fetch。
  • 您是否尝试过查看请求承诺?它使请求成为承诺。 npm install request-promise 然后添加var request = require('request-promise');

标签: javascript node.js promise


【解决方案1】:

更简洁地说,在安装 node-fetch 之后,您可以进行一个 promise-returning fetch 解析为 json...

const fetch = require('node-fetch');
function fetchJSON(url) {
    return fetch(url).then(response => response.json());
}

...从一组 url 构建一组 promise...

let urls = [url1, url2, url3, url4];
let promises = urls.map(url => fetchJSON(url));

...当这些承诺解决时做点什么...

Promise.all(promises).then(responses => console.log(responses));

【讨论】:

    【解决方案2】:

    将请求转换为承诺:

    function promiseRequest(url) {
      return new Promise(resolve => {
        request(url, function(err, response, body) {
          resolve(body);
        });
      });
    }
    

    然后你可以做类似的事情

    const allBodies = await Promise.all([
      promiseRequest(url1),
      promiseRequest(url2),
      promiseRequest(url3)
    ]);
    

    但是原生使用fetch 会更好。

    【讨论】:

    • 我打算提出同样的建议,然后我想起了 request-promise
    【解决方案3】:

    我刚刚做了

    npm install node-fetch
    

    然后

    var fetch = require('node-fetch');
    

    然后我可以使用上面的代码,即

    Promise.all([
        fetch(url1).then(function(response){ return response.json() }),
            fetch(url2).then(function(response){ return response.json() }),
                fetch(url3).then(function(response){ return response.json() }),
                    fetch(url4).then(function(response){ return response.json() })
        ]).then(allResponses => {
    
        var data1 = allResponses[0];
        var data2 = allResponses[1];
        var data3 = allResponses[2];
        var data4 = allResponses[3];
    
        // process data....
    
        });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-17
      • 2016-02-12
      • 2019-08-06
      • 2017-03-16
      • 1970-01-01
      • 2021-03-21
      相关资源
      最近更新 更多