Javascript Can';t在异步forEach循环中向数组添加元素
在我当前的项目中,使用Firebase作为后端,我有一个专门的功能,可以根据某些条件(与此问题无关)删除非活动用户 在Firebase函数中,我有一个内部函数,用于获取非活动用户,但它总是返回一个空数组:Javascript Can';t在异步forEach循环中向数组添加元素,javascript,node.js,typescript,firebase,google-cloud-functions,Javascript,Node.js,Typescript,Firebase,Google Cloud Functions,在我当前的项目中,使用Firebase作为后端,我有一个专门的功能,可以根据某些条件(与此问题无关)删除非活动用户 在Firebase函数中,我有一个内部函数,用于获取非活动用户,但它总是返回一个空数组: async function getInactiveUsers(users: any[], nextPageToken?: any): Promise<any> { const getUsers: any = await admin.auth().listUsers(100
async function getInactiveUsers(users: any[], nextPageToken?: any): Promise<any> {
const getUsers: any = await admin.auth().listUsers(1000, nextPageToken);
const threeMonthsAgo = new Date(Date.now())
threeMonthsAgo.setMonth(threeMonthsAgo.getMonth() - 3)
const inactiveThreeMonthsUsers: any = getUsers.users.filter((user: any) =>
Date.parse(user.metadata.lastSignInTime) < threeMonthsAgo.getTime()
);
if(inactiveThreeMonthsUsers.length > 0){
inactiveThreeMonthsUsers.forEach(async (user: any) => {
const UserDataRef = admin.firestore().collection('Collection').doc(user.uid);
const UserDataGet = await UserDataRef.get();
const UserData: any = UserDataGet.data();
if((UserData.firstCriteria < 1) && (UserData.secondCriteria === 0)){
users.push(user.uid);
}
});
if (getUsers.pageToken) {
return getInactiveUsers(users, getUsers.pageToken);
}
return users;
} else {
return 0
}
}
这个项目是返回的。因此,我认为forEach
循环附加了数组的一个副本
我还尝试将用户参数存储在一个新数组中,该数组在函数顶部声明,然后使用push()
方法将其追加。但这也不起作用
我的方法有什么问题?forEach循环将同步运行,而传递给它的
异步
回调将部分异步运行(之后的部分等待
)
要使循环迭代在进入下一个迭代之前等待异步代码,请使用for
循环
for (let user of inactiveThreeMonthsUsers) { .... await .... }
forEach
循环将同步运行,而传递给它的async
回调将部分异步运行(后面的部分等待
)
要使循环迭代在进入下一个迭代之前等待异步代码,请使用for
循环
for (let user of inactiveThreeMonthsUsers) { .... await .... }
很抱歉,也许是我不理解,但我认为我的getUsers正在等待用户列表。我的意思是我有
const getUsers:any=wait admin.auth().listUsers(1000,nextpGetOken)代码>对于其余部分,我的代码编辑器通常会告诉我是否存在错误的承诺处理。这在我的问题中不存在,但当我调用这个函数时,我会等待它。我的代码灵感来自Firebase在Github上提供的内容不,你是对的,没有问题。我误读了密码。问题出在forEach
中,它使得所有迭代都不需要等待。回调中的await
仅使回调等待,而不是forEach
。很抱歉,可能是我不理解,但我认为我的getUsers正在等待用户列表。我的意思是我有const getUsers:any=wait admin.auth().listUsers(1000,nextpGetOken)代码>对于其余部分,我的代码编辑器通常会告诉我是否存在错误的承诺处理。这在我的问题中不存在,但当我调用这个函数时,我会等待它。我的代码灵感来自Firebase在Github上提供的内容不,你是对的,没有问题。我误读了密码。问题出在forEach
中,它使得所有迭代都不需要等待。回调中的wait
只会使回调等待,而不是forEach
。谢谢你,确实用替换了我的forEach
,就像你表演的那样。谢谢你,用替换了我的forEach
,就像你表演的那样。
for (let user of inactiveThreeMonthsUsers) { .... await .... }