Как именно обновляется значение обещания? - PullRequest
3 голосов
/ 27 мая 2020

Предположим, что запрос fetch выполняется за 2 мс. Программа продолжает работать. Затем, через 100 мс, запрос был выполнен, но программа еще не завершила свое выполнение.

1. На этом этапе браузер действительно обновляет значение в Promise объект, даже если программа еще не завершена, или это нужно сделать в потоке Javascript, когда стек вызовов пуст?

2. Каким образом обратные вызовы onFulfilled и onRejected помещаются в очередь заданий? Насколько я знаю, они делают это при изменении состояния обещания, но как именно это делается? Наблюдает ли браузер за кулисами за изменениями в объекте и немедленно ставит в очередь обратный вызов, или это Javascript делает это после завершения выполнения синхронного кода?

EDIT: В ходе курса мне сказали, что, грубо говоря, под капотом происходило то, что свойство «value» объекта Promise обновлялось, как только запрос был успешно выполнен (даже если программа все еще работала), и немедленно вызвало две вещи: изменение состояния Promise и обратный вызов в массиве onFulfillment, который будет помещен в очередь микрозадач (при условии, что он был добавлен с использованием then). Это возможно? Изменяется ли объект Promise за пределами Javascript, или это происходит, когда программа завершает свое выполнение? Пожалуйста, поправьте меня, если я ошибаюсь.

1 Ответ

3 голосов
/ 27 мая 2020

Предполагая, что вызов fetch будет успешным без ошибок, через 100 мсек, когда запрос был правильно отправлен и тело передано, новая задача выборки ставится в очередь в задаче Networking источник , который будет обработать ответ . Этот последний алгоритм отвечает за выполнение обещания, возвращаемого window.fetch().

Итак, если в 100 мс браузеру нужно что-то еще сделать, он продолжит делать то, что было. Если, когда он это сделает, он почувствует, что у него есть более важная задача (например, событие пользовательского интерфейса?), То он сделает это раньше. Когда он продолжит выполнение этой задачи получения , он разрешит Promise, и при этом поставит в очередь микрозадачу для выполнения вашего обратного вызова сразу после того, как эта задача будет обработана (т.е. синхронно здесь).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...