Это код, который я написал:
let aop = [
'https://api.coindesk.com/v1/bpi/currentprice.json',
'https://datausa.io/api/data?drilldowns=Nation&measures=Population',
'https://api.publicapis.org/entries'
];
(async function (){
Promise.all(aop.map(async url => {
let response = await fetch(url);
let json = await response.json();
return json;
})).then(x => console.log(x))
} ());
(function functionThatTakes30SecondsToFinish (){
// Some heavy lifting tasks
}())
Я получаю то, что хочу, но мне интересно, как это работает.
Promise.all
нужен массив обещаний, поэтому я использовал .map
для этого.
Теперь то, что меня смущает, - это первая итерация: для первого URL fetch
вернет новое обещание, а затем встречается ключевое слово await
. Поскольку вызов функции имеет более высокий приоритет, чем ключевое слово await
, сначала возвращается обещание.
Я понимаю, что await
выбросит вас на один уровень за пределы вашего текущего контекста выполнения, а затем, как только обещание будет выполнено, соберите остальной код и поместите его в очередь микрозадач для выполнения.
Но в этом случае будет возвращено наше первое обещание, и мы будем выброшены на один уровень за пределы глобального контекста выполнения, выполняя следующую функцию functionThatTakes30SecondsToFinish()
Очевидно, что ни одна функция не занимает так много времени, но, для примера, давайте притворимся.
После завершения этой трудоемкой функции мы уже работали только с одним URL-адресом? Это тоже только вернуло?
В любом случае, допустим, через 5 секунд мы получили наш первый ответ, а затем await
возьмет следующий код:
let json = await response.json();
return json;
... и поместите его в очередь микрозадач для последующего выполнения.
Если это работает только для одного URL, как тогда мы снова вернемся в map
?
Или это второе, что, как я могу предположить, происходит:
map
будет просматривать все URL-адреса, возвращать обещания, а затем вместо того, чтобы возвращать что-либо в свой внутренний скрытый массив, который в конечном итоге возвращается, он принимает весь этот код:
let json = await response.json();
return json;
... и помещает его в очередь микрозадач для последующего выполнения.
Это похоже на то, что map
приостанавливает функцию обратного вызова для каждого элемента.
Я настолько сбит с толку, что даже не могу спросить об этом должным образом. Может ли кто-нибудь прояснить это для меня?