Вы не можете получить доступ к результату обещания (т.е. его выполненному значению) сразу после регистрации обработчика для обещания, потому что код обещания never вызывает обработчики, предоставленные ему синхронно.
Когда обещание становится разрешенным или отклоненным, код обещания помещает задания для выполнения обработчиков (и отслеживает их поведение) в очередь заданий обещания, оставляя выполнение задач из очереди диспетчеру событий l oop.
Это демонстрация показывает, что данные не передаются then
в том же вызове из события l oop, но могут быть доступны после возврата к событию l oop:
let dataPromise = new Promise( resolve => resolve("hello, I'm data"));
var res=[];
res.ready = false;
dataPromise.then(data => {
res.push(data);
res.ready = true;
});
function processData() {
console.log(
"ready: %s", data: %s",
res.ready, res[0]);
}
processData(); // won't work
setTimeout( processData, 20); // will work
Данные, полученные с помощью обещания, доступны только через интерфейс обещания. Код, использующий данные, может зарегистрировать обратный вызов для обещания данных, вызвав метод then
обещания или используя await
перед обещанием внутри функции async
.
Очевидно, в практическом приложении , данные также не будут доступны из запроса сервера до тех пор, пока после ответа сервера браузер не получит ответ и не уведомит код сценария о результате.