Я создаю скрипт в node.js (V8.1.3), который просматривает аналогичные данные JSON из нескольких API и сравнивает значения. Точнее, я смотрю на разные рыночные цены разных акций (фактически криптовалют).
В настоящее время я использую promise.all для ожидания всех ответов от соответствующих API.
let fetchedJSON =
await Promise.all([getJSON(settings1), getJSON(settings2), getJSON(settings3) ... ]);
Однако Promise.all выдает ошибку, если хотя бы одно обещание отклонено с ошибкой. В документах bluebird есть функция под названием Promise.some, и это почти то, что я хочу. Насколько я понимаю, он берет массив обещаний и разрешает два самых быстрых обещания для разрешения, иначе (если разрешается менее 2 обещаний) выдает ошибку.
Проблема заключается в том, что, во-первых, я не хочу, чтобы два самых быстрых промиса разрешались как то, что он возвращает, я хочу, чтобы возвращались все успешные промисы, если их больше 2. Это Кажется, это то, что делает Promise.any, за исключением минимального количества 1. (Мне требуется минимальное количество 2)
Во-вторых, я не знаю, сколько промисов я буду ожидать (другими словами, я не знаю, из скольких API я буду запрашивать данные). Это может быть только 2 или может быть 30. Это зависит от ввода пользователя.
В настоящее время я пишу это, и мне кажется, что, вероятно, есть способ получить promise.any со счетом 2, и это было бы самым простым решением. Это возможно?
Кстати, не уверен, что заголовок действительно резюмирует вопрос. Пожалуйста, предложите правку для заголовка :)
РЕДАКТИРОВАТЬ: Другой способ, которым я могу написать сценарий, заключается в том, что первые два загружаемых API начинают вычисляться и передаются в браузер, а затем каждый следующий JSON, который загружается и вычисляется после него. Таким образом, я не жду, пока все промисы будут выполнены, прежде чем я начну вычислять данные и передавать результаты во внешний интерфейс. Возможно ли это с помощью функции, которая работает и при других обстоятельствах?
То, что я имею в виду, выглядит примерно так:
Параллельный запрос JSON...
|-----JSON1------|
|---JSON-НЕУДАЧА---| > поймать ошибку > сделать что-то с ошибкой. Не влияет на следующие результаты.
|-------JSON2-------| > Соответствует минимум 2 результатам > вычисляет JSON > для браузера.
|-------JSON3---------| > вычисляет JSON > в браузер.
.forEach()
сгенерировать массив обещаний и.then()
каждое из них по отдельности? - person Patrick Roberts   schedule 30.06.2017