Функция-конструктор Promise
может принимать executor callback function
, и этот вопрос касается того, где эта функция обратного вызова находится в пространстве выполнения, когда функция обратного вызова исполнителя имеет асинхронный код.
ДЕТАЛИ:
Объект Promise
представляет значение, которое может быть еще недоступно, но будет разрешено в какой-то момент в будущем. Он позволяет вам писать асинхронный код, например, при вызове удаленной веб-службы, вы создаете объект Promise, который представляет данные, которые будут возвращены веб-службой в будущем.
Пока не будут доступны фактические данные , объект Promise действует как прокси для фактических данных.
Фрагмент кода ниже описывает эту ситуацию:
function getRandomJoke(){
return new Promise((resolve, reject) => {
const request = new XMLHttpRequest();
request.open('GET', 'https://api.icndb.com/jokes/random');
request.onload = () => {
if (request.status === 200) {
resolve(request.response); // we got data here, so resolve the Promise
} else {
reject(Error(request.statusText)); // status is not 200 OK, so reject
}
};
request.onerror = () => {
reject(Error('Error fetching data.')); // error occurred, reject the Promise
};
request.send(); // send the request
});
}
Согласно обсуждению в этом потоке , оба Создание обещания и выполнение функции обратного вызова исполнителя происходит в основном потоке, и только обратный вызов разрешения будет выполнен на следующем тике события l oop.
В этом случае функция исполнителя фрагмента кода выше имеет асинхронный код вызова API - будет ли это также зависеть от основного потока, пока API не вернет данные.