[英]How to use async/await syntax with forEach loop in Javascript?
我已經查看了幾個關於在 forEach 循環中使用 async/await 的問題,但似乎沒有任何內容涵蓋我的用戶案例......我怎樣才能讓下面的代碼工作? 現在我收到以下錯誤:
await 是一個保留字
這是代碼:
export const fetchUserBookmarks = ( bookmarksIDs ) => async ( dispatch, getState, api ) => {
dispatch({
type: 'IS_FETCHING_BOOKMARKS'
});
try {
bookmarks = [];
bookmarksIDs.forEach( bookmarkID => {
const bookmark = await api.get( selectedPostByIdEP + bookmarkID );
bookmarks.push( bookmark );
});
dispatch({
type: 'HAS_FETCHED_BOOKMARKS',
payload: bookmarks
});
} catch( error ) {
dispatch({
type: 'FAILED_FETCHING_BOOKMARKS',
payload: error
});
}
}
首先,要使用await
您應該將該函數聲明為async
。 您已使用外部函數完成此操作,但未使用內部函數完成此操作。
更改將如下所示:
bookmarksIDs.forEach(async bookmarkID => {
其次,您可能想要並行運行這些 api 調用。
您可以用map
調用替換forEach
並一起等待所有結果承諾。
為此,您的代碼應如下所示:
const bookmarks = await Promise.all(
bookmarksIDs.map(bookmarkID =>
api.get( selectedPostByIdEP + bookmarkID )
)
);
——
似乎如果bookmarks
未在其他任何地方聲明,則會導致問題。 使用const
或let
應該可以解決這個問題。
forEach
不是一個循環; 它是您傳遞函數的函數。 沒有辦法從中得到承諾。 如果要api.get
執行api.get
,可以使用 for 循環:
for (const bookmarkID of bookmarksIDs) {
const bookmark = await api.get(selectedPostByIdEP + bookmarkID);
bookmarks.push(bookmark);
}
如果你想並行執行它們,你可以創建幾個 promise 並使用Promise.all
來收集它們的結果:
const bookmarks = await Promise.all(
bookmarksIDs.map(
bookmarkID => api.get(selectedPostByIdEP + bookmarkID)
)
);
forEach 循環與 promise 和 async 函數不兼容。 使用
for.. of
循環代替。 它會工作得很好。
async(data)=>{
const ids = ["xyz","abc"]
for (const id of ids){
let data = await Collection.findById(id)
console.log(data)
}
}
你會想做這樣的事情而不是
try {
bookmarks = await Promise.all(bookmarksIDs.map( bookmarkID => api.get( selectedPostByIdEP + bookmarkID ));
dispatch({
type: 'HAS_FETCHED_BOOKMARKS',
payload: bookmarks
});
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.