如何在 Javascript 中的 forEach 循环中使用异步/等待语法?

gra*_*dev 1 javascript async-await

我已经查看了几个关于在 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
        });

    }

}
Run Code Online (Sandbox Code Playgroud)

Tal*_*l Z 8

首先,要使用await您应该将函数声明为async. 您已使用外部函数完成此操作,但未使用内部函数完成此操作。

更改将如下所示:

bookmarksIDs.forEach(async bookmarkID => {
Run Code Online (Sandbox Code Playgroud)

其次,您可能想要并行运行这些 api 调用。

您可以forEach用一个map电话替换并一起等待所有结果承诺。

为此,您的代码应如下所示:

const bookmarks = await Promise.all(
  bookmarksIDs.map(bookmarkID => 
    api.get( selectedPostByIdEP + bookmarkID )
  )
); 
Run Code Online (Sandbox Code Playgroud)

——

似乎如果bookmarks没有在其他任何地方声明它会导致问题。使用constlet应该解决这个问题。