Для последовательных обещаний использование простого цикла в функции async
очень просто и понятно:
let userIDs = [1, 2, 3];
async function uploadIDS(ids) {
for (let id of ids) {
let res = await upload(id)
console.log("Success:", res)
}
}
const upload = (example) => {
console.log('uploading...');
return new Promise(function(resolve, reject) {
resolve(example)
});
};
uploadIDS(userIDs)
{
в начале оператора сигнализирует о «блоке оператора» (см. ECMA-262-3 раздел 12.1), который содержит список операторов.
}
немедленно завершает блок операторов без операторов. Все в порядке. Но теперь парсер ищет следующее утверждение:
==false
А? Это не утверждение; синтаксическая ошибка.
Для чего нужны блоки операторов? Ну, вы пишете блок операторов каждый раз, когда говорите:
if (something) {
...
}
JavaScript определяет эти операторы управления потоком следующим образом:
if "(" <expression> ")" <statement> [else <statement>]
т.е. в единой форме заявления без скобок. Затем он позволяет вам использовать блок операторов везде, где вы можете использовать один оператор, что означает, что вы можете иметь операторы if-braces-many-операторов. Но это также означает, что вы можете иметь сам блок операторов без связанного с ним оператора управления потоком.
1118 Это абсолютно бесполезно! Вы могли бы поддаться искушению думать, что это дает вам сокрытие информации, но нет:
var a= 1;
{
var a= 2;
}
alert(a);
... приводит к 2
, потому что блоки операторов сами по себе не создают новую область видимости.
JavaScript определяет управление потоком и блоки операторов таким образом, потому что C (и другие языки, производные от него) сделали. Эти языки не заставили {}
выполнять двойную функцию в качестве литерального выражения Object, поэтому у них не было двусмысленности, которая делает эту очередную ошибку JS.
Даже этот wannabe-литерал:
{
a: 1
}
является допустимым блоком операторов, поскольку ‘:’ используется для обозначения метки в операторе. (а 1
- бесполезное выражение-выражение с пропущенной точкой с запятой.) Метки - это еще одна особенность, унаследованная от C, которая редко используется в JavaScript. Они не совсем бессмысленны, как блоки, но они редко нужны и часто рассматриваются с плохим вкусом.
(Литерал с двумя свойствами вызовет синтаксическую ошибку, поскольку литералы объектов используют разделители запятых, но помеченные операторы должны быть разделены точками с запятой.)
Это не единственное место где свободный синтаксис JavaScript может сбить вас с толку, сделав какое-то другое утверждение того, что вы считаете выражением.
Проще говоря, {}==false
компилируется компилятором Js в {};==false
, так что это синтаксическая ошибка. Вы должны написать ({})==false
, и он вернет false.
Хорошо, я изучил спецификацию ECMAScript (PDF) и у меня есть объяснение, в котором обсуждается грамматика BNF .
] Исходные тексты ECMAScript анализируются, начиная с главного символа, называемого Program
:
Program:
SourceElements
SourceElements ' не может начинаться с открывающейся фигурной скоба, потому что это может сделать это неоднозначно с Блоком. Также ExpressionStatement не может начинаться с ключевое слово функции, потому что это может сделать это двусмысленным с FunctionDeclaration.
Таким образом, мы можем иметь выражение в начале программы , но оно не должно начинаться с открывающей фигурной скобки ( {
). Вот почему работает следующее:
({} == false);
alert ({} == false);
! {} == false;