如何在Javascript中使用async / await语法和forEach循环?

时间:2018-04-09 06:53:04

标签: javascript async-await

我看了几个关于使用async / await和forEach循环的问题,但似乎没有任何内容覆盖我的用户案例......我怎样才能让下面的代码工作?现在我收到以下错误:

  

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
        });

    }

}

4 个答案:

答案 0 :(得分:3)

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

此更改将如下所示:

bookmarksIDs.forEach(async bookmarkID => {

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

您可以将forEach替换为map,并等待所有产生的承诺。

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

const bookmarks = await Promise.all(
  bookmarksIDs.map(bookmarkID => 
    api.get( selectedPostByIdEP + bookmarkID )
  )
); 

-

似乎如果bookmarks未在其他任何地方声明,则会导致问题。使用constlet可以解决该问题。

答案 1 :(得分:1)

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)
    } 
}

答案 2 :(得分:0)

你想要做这样的事情

try {

    bookmarks = await Promise.all(bookmarksIDs.map( bookmarkID => api.get( selectedPostByIdEP + bookmarkID )); 

    dispatch({
        type: 'HAS_FETCHED_BOOKMARKS', 
        payload: bookmarks
    });

}

答案 3 :(得分:0)

forEach不是循环;它是一个函数,你传递一个函数。没有办法从中得到承诺。如果您想逐个执行api.get,可以使用for循环:

for (const bookmarkID of bookmarksIDs) {
    const bookmark = await api.get(selectedPostByIdEP + bookmarkID); 
    bookmarks.push(bookmark); 
}

如果您想并行执行这些操作,可以创建多个承诺并使用Promise.all来收集结果:

const bookmarks = await Promise.all(
    bookmarksIDs.map(
        bookmarkID => api.get(selectedPostByIdEP + bookmarkID)
    )
);