2017-08-18 37 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']);