Как использовать 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....
});