這段代碼本質上是從 api 獲取一些資料,并將其放入兩個陣列中,然后我使用渲染引擎在頁面上渲染。它有效,但我想知道是否有更好的不同方法(因為第一個 await 呼叫必須在第二個呼叫之前完成 - 也許使用 Promise.all - 但是我如何將陣列傳遞給渲染?我見過的大多數代碼示例直接從 Promise.all 回傳 [return await Promise.all(etc)])
app.get('/', async (req, res) => {
const fic = [];
const non = [];
await getBooks(fic, API.URL_HARDCOVER_FICTION);
await getBooks(non, API.URL_HARDCOVER_NONFICTION);
res.render('layout', {results: {fic: fic, non: non}});
});
const getBooks = async (array, url) => {
await axios.get(url "?api-key=" API.Key)
.then( async res => {
const list = await res.data.results.books;
list.forEach( book => {
array.push(new Book(
book.primary_isbn13,
book.title,
book.author));
})
})
.catch(error => {
console.error(error);
});
return array;
}
uj5u.com熱心網友回復:
一些評論:
是的,您可以使用
Promise.all. 順序沒有問題,因為Promise.all將決議為與您作為引數傳遞的承諾陣列的順序相同的履行值陣列。getBooks不需要array引數,因為它具有創建陣列本身然后回傳它所需的一切。代替
.forEachandpush,使用.mapandreturn。res.data.results.books不是一個承諾,所以它不需要await那個運算式。
改編代碼:
app.get('/', async (req, res) => {
const urls = [API.URL_HARDCOVER_FICTION, API.URL_HARDCOVER_NONFICTION];
const [fic, non] = await Promise.all(urls.map(getBooks));
res.render('layout', {results: {fic, non}});
});
const getBooks = async (url) => {
const res = await axios.get(url "?api-key=" API.Key);
return res.data.results.books.map(book => new Book(
book.primary_isbn13,
book.title,
book.author
));
};
我省略了錯誤處理。首先確保它有效,然后添加一個try..catch塊。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/504143.html
標籤:javascript 节点.js 异步等待
