Модули JavaScript оцениваются асинхронно. Однако весь импорт оценивается до того, как тело модуля выполнит импорт. Это отличает модули JavaScript от модулей CommonJS в Node или _ 1_ теги без атрибута async
. Модули JavaScript ближе к спецификации AMD, когда дело доходит до как они загружены. Подробнее см. раздел 16.6.1 Изучение ES6 Автор Аксель Раушмайер.
Таким образом, в примере, представленном запрашивающим, порядок выполнения не может быть гарантирован. Есть два возможных исхода. Мы можем увидеть это в консоли:
one
two
three
Или мы можем увидеть это:
two
one
three
Другими словами, два импортированных модуля могли выполнять свои console.log()
вызовы в любом порядке; они асинхронны относительно друг друга. Но они определенно будут выполнены до тела модуля, который их импортирует, поэтому "three"
гарантированно будет занесен в журнал последним.
Асинхронность модулей можно наблюдать при использовании операторы await
верхнего уровня (теперь реализованы в Chrome). Например, предположим, что мы немного изменили пример вопрошающего:
// main.js
import './one.js';
import './two.js';
console.log('three');
// one.js
await new Promise(resolve => setTimeout(resolve, 1000));
console.log('one');
// two.js
console.log('two');
Когда мы запускаем main.js
, мы видим в консоли следующее (с добавленными метками времени для иллюстрации):
[0s] two
[1s] one
[1s] three
person
McMath
schedule
22.02.2016
import
. - person Bergi   schedule 23.02.2016