Как использовать Promise.all с Запросом в node.js?

Я хотел бы сделать что-то вроде:

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

Но как бы я использовал запрос с Promise.all? Потому что я хочу получить несколько вещей и обрабатывать их только тогда, когда все будет сделано, но в Node, и я бы не стал использовать кучу обратных вызовов.

3 ответа

Говоря более кратко, после установки node-fetch вы можете сделать возвращающую обещание выборку, которая разрешается в json...

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

... построить массив обещаний из массива URL-адресов...

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

... сделай что-нибудь, когда эти обещания разрешатся...

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

Преобразуйте запросы в обещания:

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 изначально.

Я только что сделал

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....

    });
Другие вопросы по тегам