#javascript #es6-promise
#javascript #es6-обещание
Вопрос:
Я использую только чистый JS и HTML. Никаких фреймворков.
Я загружаю несколько HTML-файлов в свой index.html . После того, как все они будут извлечены, я хотел бы продолжить работу со сценарием. Я пытаюсь выяснить, как это решить (я думаю, с помощью Promises), но не могу заставить это работать. Как дождаться завершения всех из них?
const prepareHead = fetch("../static/_includes/_head.html")
.then(response => {
return response.text()
})
.then(data => {
document.querySelector("head").innerHTML = data;
resolve();
});
const prepareHeader = fetch("../static/_includes/_header.html")
.then(response => {
return response.text()
})
.then(data => {
document.querySelector("header").innerHTML = data;
});
const prepareStaticLinks = fetch("../static/_includes/_static_links.html")
.then(response => {
return response.text()
})
.then(data => {
document.querySelector("static_links").innerHTML = data;
});
const prepareFooter = fetch("../static/_includes/_footer.html")
.then(response => {
return response.text()
})
.then(data => {
document.querySelector("footer").innerHTML = data;
});
await Promise.all([prepareHead, prepareHeader, prepareFooter, prepareStaticLinks]);
// next line should be called only after all files are fetched
console.log("document prepared");
но await Promise
не работает:
Uncaught SyntaxError: await is only valid in async functions and async generators
Каков правильный способ сделать это?
Комментарии:
1. в нем уже сказано, что вам нужно сделать, это допустимо только в
async function() { ... }
2. синтаксис async / await — это всего лишь другой способ написания обещаний. удалите свой
await
, и все должно быть хорошо.3. Попробуйте
Promise.all(...fetches)
посмотреть: Сделайте что-нибудь > Ожидание завершения нескольких ответов all API > Одновременный вызов нескольких API
Ответ №1:
Попробуйте заменить
await Promise.all([prepareHead, prepareHeader, prepareFooter, prepareStaticLinks]);
console.log("document prepared");
с помощью
Promise.all([prepareHead, prepareHeader, prepareFooter, prepareStaticLinks])
.then(() => {
console.log("document prepared")
});
Другим вашим вариантом было бы использовать await
внутри async
функции, например
const getData = async () => {
const prepareHead = fetch("../static/_includes/_head.html")
.then(response => {
return response.text()
})
.then(data => {
document.querySelector("head").innerHTML = data;
resolve();
});
const prepareHeader = fetch("../static/_includes/_header.html")
.then(response => {
return response.text()
})
.then(data => {
document.querySelector("header").innerHTML = data;
});
const prepareStaticLinks = fetch("../static/_includes/_static_links.html")
.then(response => {
return response.text()
})
.then(data => {
document.querySelector("static_links").innerHTML = data;
});
const prepareFooter = fetch("../static/_includes/_footer.html")
.then(response => {
return response.text()
})
.then(data => {
document.querySelector("footer").innerHTML = data;
});
await Promise.all([prepareHead, prepareHeader, prepareFooter, prepareStaticLinks]);
// next line should be called only after all files are fetched
console.log("document prepared");
};
getData();