2017-07-30 254 views
0

我正在使用節點。我有一個ID數組。我想根據其他API調用的響應來過濾它們。所以我想填充每個ID,並知道他們是否聲明或不是基於API的過濾器。NodeJS - 映射forEach異步/等待

我正在使用async/await。我發現最好的方法是使用Promises.all,但這不能按預期工作。我做錯了什麼?

static async processCSGOUsers (groupId, parsedData) { 

     let steamIdsArr = []; 

     const usersSteamIds = parsedData.memberList.members.steamID64; 

     const filteredUsers = await Promise.all(usersSteamIds.map(async (userId) => { 
      return csGoBackpack(userId).then((response) => { 
        return response.value > 40; 
       }) 
       .catch((err) => { 
        return err; 
       }); 
     })); 

     Object.keys(usersSteamIds).forEach(key => { 
      steamIdsArr.push({ 
       steam_group_id_64: groupId, 
       steam_id_64: usersSteamIds[key] 
      }); 
     }); 

     return UsersDao.saveUsers(steamIdsArr); 
} 

除此之外,它發生了一些奇怪的事情。當我解決這個問題時,這個方法的數據參數會很好。當我到達Promise.all的行時,我得到了每個參數的「參考錯誤」。我不知道爲什麼。對於所有響應

+1

你做這樣的東西,在一個簡單的方法'不要在任何地方使用filteredUsers,但即使你是這樣,它也會是一個布爾值數組,而不是像你期望的基於變量名的過濾用戶數組。 –

+0

對不起,過濾的用戶在Object.keys上(忘記更新)。你對布爾值是正確的,但我沒有得到:/ –

+0

你可以[編輯]你的問題,以糾正任何錯誤,如果你想。 –

回答

2

等待,然後過濾根據結果:

const responses = await Promise.all(usersSteamIds.map(csGoBackpack)); 
// responses now contains the array of responses for each user ID 
// filter the user IDs based on the corresponding result 
const filteredUsers = usersSteamIds.filter((_, index) => responses[index].value > 40); 
+0

這看起來是正確的,基於我期望API做的事情。 –

+0

好的答案! :D:D:D –