Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/413.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Can';t在异步forEach循环中向数组添加元素_Javascript_Node.js_Typescript_Firebase_Google Cloud Functions - Fatal编程技术网

Javascript Can';t在异步forEach循环中向数组添加元素

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

在我当前的项目中,使用Firebase作为后端,我有一个专门的功能,可以根据某些条件(与此问题无关)删除非活动用户

在Firebase函数中,我有一个内部函数,用于获取非活动用户,但它总是返回一个空数组:

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 .... }