Здесь показаны различия между двумя версиями данной страницы.
| Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
|
nodejs:steams:promise.all_restrict [2022/05/15 11:59] werwolf |
nodejs:steams:promise.all_restrict [2023/01/12 12:18] (текущий) |
||
|---|---|---|---|
| Строка 5: | Строка 5: | ||
| Сокращенная версия этого кода в настоящее время выглядит примерно так: | Сокращенная версия этого кода в настоящее время выглядит примерно так: | ||
| - | <code> | + | <code javascript> |
| function getCounts() { | function getCounts() { | ||
| return users.map(user => { | return users.map(user => { | ||
| Строка 24: | Строка 24: | ||
| - | ===== ОТВЕТЫ ===== | ||
| - | === Ответ 1 === | + | |
| + | ====es6-promise-pool==== | ||
| Обратите внимание, что ''Promise.all()'' не запускает promises, чтобы начать свою работу, создавая само обещание. | Обратите внимание, что ''Promise.all()'' не запускает promises, чтобы начать свою работу, создавая само обещание. | ||
| Строка 34: | Строка 34: | ||
| Однако нет необходимости изобретать колесо здесь. [[https://www.npmjs.com/package/es6-promise-pool|Одна библиотека, которую вы могли бы использовать для этой цели, - ]]''[[https://www.npmjs.com/package/es6-promise-pool|es6-promise-pool]]''. Из их примеров: | Однако нет необходимости изобретать колесо здесь. [[https://www.npmjs.com/package/es6-promise-pool|Одна библиотека, которую вы могли бы использовать для этой цели, - ]]''[[https://www.npmjs.com/package/es6-promise-pool|es6-promise-pool]]''. Из их примеров: | ||
| - | <code> | + | <code javascript> |
| - | // On the Web, leave out this line and use the script tag above instead. | + | // On the Web, leave out this line and use the script tag above instead. |
| var PromisePool = require('es6-promise-pool') | var PromisePool = require('es6-promise-pool') | ||
| Строка 62: | Строка 62: | ||
| </code> | </code> | ||
| - | === Ответ 2 === | + | ====p-limit==== |
| **С-Концевой** | **С-Концевой** | ||
| Строка 72: | Строка 72: | ||
| Быть совместимым с async в примере | Быть совместимым с async в примере | ||
| - | * [[https://www.w3schools.com/js/js_versions.asp|ECMAScript 2017 (версия 8)]] | + | * [[https://www.w3schools.com/js/js_versions.asp|ECMAScript 2017 (версия 8)]] |
| - | * Версия узла> [[https://node.green|8.2.1]] | + | * Версия узла> [[https://node.green|8.2.1]] |
| **Мой пример** | **Мой пример** | ||
| Строка 79: | Строка 79: | ||
| В этом примере нам нужно запустить функцию для каждого URL в массиве (например, может быть, запрос API). Здесь это называется ''fetchData()''. Если бы у нас был массив тысяч элементов для обработки, параллелизм определенно был бы полезен для экономии ресурсов ЦП и памяти. | В этом примере нам нужно запустить функцию для каждого URL в массиве (например, может быть, запрос API). Здесь это называется ''fetchData()''. Если бы у нас был массив тысяч элементов для обработки, параллелизм определенно был бы полезен для экономии ресурсов ЦП и памяти. | ||
| - | <code> | + | <code javascript> |
| const pLimit = require('p-limit'); | const pLimit = require('p-limit'); | ||
| Строка 108: | Строка 108: | ||
| Результат журнала консоли - это массив данных ответа ваших разрешенных обещаний. | Результат журнала консоли - это массив данных ответа ваших разрешенных обещаний. | ||
| - | === Ответ 3 === | + | ====bluebird==== |
| [[http://bluebirdjs.com/docs/api/promise.map.html|Bluebird Promise.map]] может использовать параметр параллелизма, чтобы контролировать, сколько обещаний должно выполняться параллельно. Иногда это проще, чем ''.all'' потому что вам не нужно создавать массив обещаний. | [[http://bluebirdjs.com/docs/api/promise.map.html|Bluebird Promise.map]] может использовать параметр параллелизма, чтобы контролировать, сколько обещаний должно выполняться параллельно. Иногда это проще, чем ''.all'' потому что вам не нужно создавать массив обещаний. | ||
| - | <code> | + | <code javascript> |
| const Promise = require('bluebird') | const Promise = require('bluebird') | ||
| Строка 128: | Строка 128: | ||
| </code> | </code> | ||
| - | === Ответ 4 === | + | ====http.Agent({maxSockets: 5})==== |
| Вместо использования обещаний для ограничения http-запросов используйте встроенный узел [[https://nodejs.org/api/http.html#http_agent_maxsockets%23http_agent_maxsockets|http.Agent.maxSockets]]. Это устраняет необходимость использования библиотеки или написания собственного кода пула и дает дополнительное преимущество, позволяющее лучше контролировать то, что вы ограничиваете. | Вместо использования обещаний для ограничения http-запросов используйте встроенный узел [[https://nodejs.org/api/http.html#http_agent_maxsockets%23http_agent_maxsockets|http.Agent.maxSockets]]. Это устраняет необходимость использования библиотеки или написания собственного кода пула и дает дополнительное преимущество, позволяющее лучше контролировать то, что вы ограничиваете. | ||
| - | > agent.maxSockets По умолчанию установлено бесконечность. Определяет, сколько одновременных сокетов агент может открыть для каждого источника. Источник - это либо комбинация "хост: порт", либо "хост: порт: локальный адрес". | + | > agent.maxSockets По умолчанию установлено бесконечность. Определяет, сколько одновременных сокетов агент может открыть для каждого источника. Источник - это либо комбинация "хост: порт", либо "хост: порт: локальный адрес". |
| Например: | Например: | ||
| - | <code> | + | <code javascript> |
| var http = require('http'); | var http = require('http'); | ||
| var agent = new http.Agent({maxSockets: 5}); // 5 concurrent connections per origin | var agent = new http.Agent({maxSockets: 5}); // 5 concurrent connections per origin | ||
| var request = http.request({..., agent: agent}, ...); | var request = http.request({..., agent: agent}, ...); | ||
| + | |||
| </code> | </code> | ||
| Если вы делаете несколько запросов к одному и тому же источнику, вам также может быть полезно установить для ''keepAlive'' значение true (дополнительную информацию см. В документации выше). | Если вы делаете несколько запросов к одному и тому же источнику, вам также может быть полезно установить для ''keepAlive'' значение true (дополнительную информацию см. В документации выше). | ||
| - | === Ответ 5 === | + | ====iterator==== |
| Если вы знаете, как работают итераторы и как они используются, вам не понадобится дополнительная библиотека, так как создать собственный параллелизм очень просто. Позвольте мне продемонстрировать: | Если вы знаете, как работают итераторы и как они используются, вам не понадобится дополнительная библиотека, так как создать собственный параллелизм очень просто. Позвольте мне продемонстрировать: | ||
| - | <code> | + | <code javascript> |
| - | /* [Symbol.iterator]() is equivalent to .values() | + | /* [Symbol.iterator]() is equivalent to .values() |
| const iterator = [1,2,3][Symbol.iterator]() */ | const iterator = [1,2,3][Symbol.iterator]() */ | ||
| const iterator = [1,2,3].values() | const iterator = [1,2,3].values() | ||
| Строка 167: | Строка 168: | ||
| </code> | </code> | ||
| - | === Ответ 6 === | + | ====p-limit MongoDB==== |
| Вот основной пример для потоковой передачи и "p-limit". Это потоковое чтение HTTP потока в Монго БД. | Вот основной пример для потоковой передачи и "p-limit". Это потоковое чтение HTTP потока в Монго БД. | ||
| - | <code> | + | <code javascript> |
| const stream = require('stream'); | const stream = require('stream'); | ||
| const util = require('util'); | const util = require('util'); | ||
| Строка 213: | Строка 214: | ||
| </code> | </code> | ||
| - | === Ответ 7 === | + | ====рекурсия==== |
| Это может быть решено с помощью рекурсии. | Это может быть решено с помощью рекурсии. | ||
| Строка 219: | Строка 220: | ||
| Идея состоит в том, что изначально вы отправляете максимально допустимое количество запросов, и каждый из этих запросов должен рекурсивно продолжать отправлять сам себя после своего завершения. | Идея состоит в том, что изначально вы отправляете максимально допустимое количество запросов, и каждый из этих запросов должен рекурсивно продолжать отправлять сам себя после своего завершения. | ||
| - | <code> | + | <code javascript> |
| function batchFetch(urls, concurrentRequestsLimit) { | function batchFetch(urls, concurrentRequestsLimit) { | ||
| return new Promise(resolve => { | return new Promise(resolve => { | ||
| Строка 257: | Строка 258: | ||
| </code> | </code> | ||
| - | === Ответ 8 === | + | ====batch-promises==== |
| Поэтому я попытался заставить некоторые показанные примеры работать для моего кода, но так как это было только для сценария импорта, а не для производственного кода, использование [[https://www.npmjs.com/package/batch-promises|пакетных обещаний]] пакета npm, несомненно, было для меня самым простым путем | Поэтому я попытался заставить некоторые показанные примеры работать для моего кода, но так как это было только для сценария импорта, а не для производственного кода, использование [[https://www.npmjs.com/package/batch-promises|пакетных обещаний]] пакета npm, несомненно, было для меня самым простым путем | ||
| Строка 267: | Строка 268: | ||
| **Использование:** | **Использование:** | ||
| - | <code> | + | <code javascript> |
| batch-promises | batch-promises | ||
| Easily batch promises | Easily batch promises | ||
| Строка 295: | Строка 296: | ||
| </code> | </code> | ||
| - | === Ответ 9 === | + | ====Promise.race==== |
| Это то, что я сделал с помощью ''Promise.race'', внутри моего кода здесь | Это то, что я сделал с помощью ''Promise.race'', внутри моего кода здесь | ||
| - | <code> | + | <code javascript> |
| const identifyTransactions = async function() { | const identifyTransactions = async function() { | ||
| let promises = [] | let promises = [] | ||
| Строка 316: | Строка 317: | ||
| Если вы хотите увидеть пример: [[https://jsfiddle.net/thecodermarcelo/av2tp83o/5|https://jsfiddle.net/thecodermarcelo/av2tp83o/5/]] | Если вы хотите увидеть пример: [[https://jsfiddle.net/thecodermarcelo/av2tp83o/5|https://jsfiddle.net/thecodermarcelo/av2tp83o/5/]] | ||
| - | === Ответ 10 === | + | ====рекурсия с внешними библиотеками==== |
| Рекурсия - это ответ, если вы не хотите использовать внешние библиотеки | Рекурсия - это ответ, если вы не хотите использовать внешние библиотеки | ||
| - | <code> | + | <code javascript> |
| downloadAll(someArrayWithData){ | downloadAll(someArrayWithData){ | ||
| var self = this; | var self = this; | ||
| Строка 338: | Строка 339: | ||
| </code> | </code> | ||
| - | === Ответ 11 === | + | ====async-pool==== |
| Я предлагаю библиотеку async-pool: [[https://github.com/rxaviers/async-pool|https://github.com/rxaviers/async-pool]] | Я предлагаю библиотеку async-pool: [[https://github.com/rxaviers/async-pool|https://github.com/rxaviers/async-pool]] | ||
| - | > Выполнить несколько обещаний, возвращающих & асинхронные функции с ограниченным параллелизмом с использованием собственного ES6/ES7 asyncPool выполняет несколько обещающих возврат & асинхронные функции в ограниченном пуле параллелизма. Он отклоняет сразу же, как только одно из обещаний отклоняется. Это решает, когда все обещания завершаются. Он вызывает функцию итератора как можно скорее (при ограничении параллелизма). | + | > Выполнить несколько обещаний, возвращающих & асинхронные функции с ограниченным параллелизмом с использованием собственного ES6/ES7 asyncPool выполняет несколько обещающих возврат & асинхронные функции в ограниченном пуле параллелизма. Он отклоняет сразу же, как только одно из обещаний отклоняется. Это решает, когда все обещания завершаются. Он вызывает функцию итератора как можно скорее (при ограничении параллелизма). |
| Установка: | Установка: | ||
| - | > npm установить крошечный-асинхронный пул | + | > npm установить крошечный-асинхронный пул |
| - | === Ответ 12 === | + | ====async/await==== |
| Это становится относительно тривиально с async/await, в зависимости от того, что вы хотите, это хорошо переносится на карту с задержкой или forEach, вот реализация карты. | Это становится относительно тривиально с async/await, в зависимости от того, что вы хотите, это хорошо переносится на карту с задержкой или forEach, вот реализация карты. | ||
| - | <code> | + | <code javascript> |
| const sleep = ms => new Promise(resolve => setTimeout(resolve, ms)) | const sleep = ms => new Promise(resolve => setTimeout(resolve, ms)) | ||