await
не блокирует - это было бы очень неудобно для пользователя и приложения - оно просто ждет выполнения обещания, прежде чем продолжить, и не может быть выполнено на верхнем уровне (пока).Если вы хотите, чтобы we are here
отображался только после завершения инициализации, вам нужно иметь доступ к обещанию, которое разрешается после завершения инициализации, а затем вызывать then
для него.
Вы также должны убедиться, чтоinitalize
возвращает Обещание, чтобы его можно было связать с внешним вызовом на a
.
Итак, вы можете попробовать что-то вроде этого:
const dummyRequest = () => new Promise(res => setTimeout(res, 1000, 'response'));
class A {
// filename = "./resources/test.json";
constructor() {
console.log("constructor");
}
startFetch() {
return this.fetchAsync(this.filename || 'foo')
.then(data => this.initialize(data)).catch(reason => console.log(reason.message))
}
async fetchAsync(filename) {
console.log("entering fetchAsync...");
// let data = await (await fetch(filename)).json();
const data = await dummyRequest();
console.log("leaving fetchAsync.");
return data;
}
initialize() {
return new Promise(resolve => {
setTimeout(() => {
console.log("finish initialization");
resolve();
}, 1000);
});
}
}
const a = new A();
a.startFetch()
.then(() => {
console.log("*** we are here!!! ***");
});
Конструкторы не могут быть асинхронными, поэтому я сделал функцию startFetch
.