我看了几个关于使用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
});
}
}
答案 0 :(得分:3)
首先,要使用await
,您应该将该函数声明为async
。您已使用外部函数完成此操作,但未使用内部函数。
此更改将如下所示:
bookmarksIDs.forEach(async bookmarkID => {
其次,你可能想要的是并行运行这些api调用。
您可以将forEach
替换为map
,并等待所有产生的承诺。
为此,您的代码应如下所示:
const bookmarks = await Promise.all(
bookmarksIDs.map(bookmarkID =>
api.get( selectedPostByIdEP + bookmarkID )
)
);
-
似乎如果bookmarks
未在其他任何地方声明,则会导致问题。使用const
或let
可以解决该问题。
答案 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)
)
);