Что происходит, когда вы ждете, чтобы выполнить обещание в узле - PullRequest
1 голос
/ 26 апреля 2020
const fetchPromise = fetch('example.com') // Takes 1 second to resolve
...
... // Do 3 seconds of work
...
const response = await fetchPromise // What happens with the promise between seconds 2-3?

Что происходит с ответом на обещание, прежде чем вы решите это обещание?

В примере выше, что происходит с ответом на выборку в те 2 секунды, когда у вашей программы есть элементы в стеке вызовов, но вы не выполняете обещание? Есть ли в Node какой-то кэш для выполненных, но не разрешенных обещаний?

1 Ответ

1 голос
/ 26 апреля 2020

здесь есть большое чтение о событии l oop.

В перспективе высокого уровня всегда есть работающий l oop, слушающий события в форме список действий и обрабатывает их по одному.

Код, которым вы поделились выше, не может использоваться глобально из-за однопоточного дизайна nodejs. nodejs делает то, что каждый раз, когда вы вызываете функцию, она помещается в очередь и обрабатывается. На каждом тике вы выталкиваете что-то из очереди и запускаете его или запускаете sh что-то новое.

В js мире никакие 2 вещи не могут запускаться одновременно. Если вы запускаете долго работающий код js, он блокирует всю систему, поэтому ваша система не реагирует на новые события, так как событие l oop заблокировано.

При этом существует другая сторона истории, когда вы Запустите все эти неблокирующие функции, которые они обрабатывают за кулисами в движке v8 js. Начиная с нативного кода v8, он может использовать такие вещи, как несколько потоков, и ждать, пока все закончится sh, или опросить вещи, проверяя, готовы ли они и какие вещи готовы, новое сообщение вставляется обратно в событие js l * 1028. * и вы получаете доступ к данным в js мире.

Итак, возвращаясь к вашему вопросу в асинхронной c функции, когда вы вызываете await, это на самом деле означает, что вы уступаете выполнение остальным вещам, ожидающим в очереди сообщений и как только то, что вы ожидали, готовится, оно отодвигается обратно в очередь, и вы продолжаете с того места, где вы оставили.

На самом деле ожидания не существует, и смысл ожидания не в том, чтобы заблокировать событие l oop с помощью встроенной функции блокировки и передать выполнение другим вещам, и вы выполняете асинхронную c функцию в конец дня возвращает обещание, которое имеет смысл только в том случае, если вы используете .then и добавляете обратный вызов для передачи обратно в мир js, когда данные будут готовы.

...