2017-08-18 60 views
0

工作,我有以下代碼:異步伺機不在的forEach

async function goodUsers(users) { 
    const filteredUsers = []; 

    users.forEach(async (userInstance) => { 
    console.log('TEST1'); 

    const fromUserContacts = await db.userContactInvite.findAll({ 
     where: { 
     fromUserId: userInstance.id, 
     }, 
    }); 
    console.log('TEST2'); 
    await fromUserContacts.forEach((fromUserContact) => { 
     console.log('TEST3'); 
     const userJson = fromUserContact.toJSON(); 
     userJson.contactState = 'INVITATION_SENT'; 
     filteredUsers.push(userJson); 
    }); 

    console.log('TEST4'); 
    }); 

    console.log('FILTERED', filteredUsers); 
    return filteredUsers; 
} 

當我打電話goodUsers我得到以下輸出: TEST1 FILTERED TEST2 TEST3 TEST4

FILTERED應該是最後一次(明顯)。

我嘗試了各種選擇,但我似乎並沒有在這裏理解一些東西。你們知道發生了什麼事嗎?

+0

請問您的數據庫的方法實際上是返回一個承諾? – Paul

+0

沒有人工作 –

+2

[在循環中使用async/await]可能的副本(https://stackoverflow.com/questions/45505517/using-async-await-inside-for-loop) –

回答

1

這是一個正確的行爲,async/await隻影響使用它們的功能。所以,你需要更換forEach其中的每個元素調用回調,以for操作:

async function goodUsers(users) { 
 
    const filteredUsers = []; 
 

 
    for(user in users) { 
 
    console.log('TEST1'); 
 
    const fromUserContacts = await new Promise(resolve => setTimeout(() => resolve(['c1', 'c2']), 500)); 
 

 
    console.log('TEST2'); 
 
    fromUserContacts.forEach(fromUserContact => { 
 
     console.log('TEST3'); 
 
     filteredUsers.push('json'); 
 
    }); 
 

 
    console.log('TEST4'); 
 
    } 
 

 
    console.log('FILTERED', filteredUsers); 
 
    return filteredUsers; 
 
} 
 

 
goodUsers(['u1', 'u2']);