如何在node.js中使用Promise.all和Request?

问题描述 投票:0回答:3

我想做一些类似的事情:

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 中)处理它们,而且我不想使用一堆回调。

javascript node.js promise
3个回答
4
投票

更简洁地说,安装node-fetch后,您可以进行一个解析为json的承诺返回的fetch...

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

1
投票

将请求转化为承诺:

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
会更好。


0
投票

我刚刚做了

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....
});
© www.soinside.com 2019 - 2024. All rights reserved.