Как я могу вызывать функцию только после завершения всех запросов?

В настоящее время я генерирую несколько запросов с использованием пакета npm request следующим образом:

for (var i = 0; i < array.length; i++) {

    var options = {
        url: '...',
        headers: {
            '...'
        }
    };
    function callback(error, response, body) {

    };
    request(options, callback);

}


function toBeCalledWhenAllRequestsHaveFinished() {

}

Я просто не знаю, как вызывать toBeCalledWhenAllRequestsHaveFinished() только после завершения всех запросов.

То, что должно быть сделано ?


person TheProgrammer    schedule 28.06.2018    source источник
comment
Альтернатива - используйте Promise.all. Это дает успех, когда все ваши запросы выполнены   -  person Aseem Upadhyay    schedule 28.06.2018
comment
Взгляните на davidwalsh.name/promises. Он выпущен в 2015 году, но все еще является хорошим источником для понимания промисов.   -  person Sebastiaan van Arkens    schedule 28.06.2018
comment
Используя этот request интерфейсный модуль, перейдите по этой ссылке GitHub.   -  person Alex    schedule 28.06.2018


Ответы (1)


Я настоятельно рекомендую использовать пакет node-fetch.

Ссылка на оригинальный постер


Установите node-fetch с помощью npm install node-fetch --save.

Сделать обещание, возвращающее выборку, которая разрешается в JSON

const fetch = require('node-fetch');
function fetchJSON(url) {
    // Add options
    var options = {
        headers: {
            '...'
        }
    };
    return fetch(url, options).then(response => response.json());
}

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

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

Позвоните toBeCalledWhenAllRequestsHaveFinished(), когда все промисы будут выполнены.

Promise.all(promises).then(responses => toBeCalledWhenAllRequestsHaveFinished(responses));
person Alex    schedule 28.06.2018
comment
Если вам нужно продублировать весь ответ, вам следует закрыть этот вопрос как дубликат. - person str; 28.06.2018
comment
Ответ в сообщении не был помечен как Best Answer, поэтому до тех пор нет смысла отмечать это. - person Alex; 28.06.2018
comment
Это не имеет значения. По крайней мере, это самый популярный вопрос. - person str; 28.06.2018
comment
Это так, если вы хотите отметить этот пост, я не буду вас останавливать. - person Alex; 28.06.2018
comment
Что насчет вариантов? - person TheProgrammer; 28.06.2018
comment
@TheProgrammer проверьте обновленный код. Вы также должны прочитать документацию. - person Alex; 28.06.2018
comment
@TheProgrammer также зайдите на веб-сайт node-fetch npm, Ctrl+F и найдите fetch(url[, options]). - person Alex; 28.06.2018
comment
@Alex Я получаю {"size":0,"timeout":0} в ответ - person TheProgrammer; 28.06.2018
comment
Я почти уверен, что параметры нужно как-то обернуть, я никогда не использовал node-fetch, проверьте документацию и попробуйте следовать тому, что там написано. - person Alex; 28.06.2018
comment
@Alex Алекс, я не могу принять неполный ответ по правилам SO - person TheProgrammer; 28.06.2018
comment
Я предполагаю, что вам нужно обернуть параметры в {}, например, `return fetch(url, {options})` - person Alex; 28.06.2018
comment
@TheProgrammer Я не сосредоточен на Accepted Answer, я сосредоточен на том, чтобы ваш код работал. - person Alex; 28.06.2018
comment
@TheProgrammer ищет // post with JSON на bitinn/node-fetch github. Он показывает вам, как добавлять заголовки и другие параметры. - person Alex; 28.06.2018
comment
@Alex Если я это сделаю, ответ сработает, но мне нужно иметь возможность модифицировать данные, которые отправляются обратно в каждом ответе, сейчас я пытаюсь: }).then(function(response) { console.log(RESPONSE: +JSON.stringify(ответ)), но не получается - person TheProgrammer; 28.06.2018
comment
@Alex Отредактированный вопрос. - person TheProgrammer; 28.06.2018
comment
@TheProgrammer добавили ли вы аргумент responses в свою функцию toBeCalledWhenAllRequestsHaveFinished(). Добавьте его и внутри этой функции выполните console.log(responses) - person Alex; 28.06.2018
comment
@Alex Теперь отредактировал мой вопрос с полным псевдокодом, чтобы вы лучше поняли, что я хочу сделать. (По-прежнему получил тот же ответ после добавления того, что вы предложили) - person TheProgrammer; 28.06.2018
comment
@str Знаете ли вы, что здесь происходит? - person TheProgrammer; 28.06.2018
comment
В итоге нашел решение. Вы указали мне правильное направление. Ответ принят и одобрен: D Хорошего дня! - person TheProgrammer; 28.06.2018
comment
Приятно слышать. Рад любой помощи! :) @Программист - person Alex; 28.06.2018