等待then()完成

时间:2020-03-13 12:37:48

标签: node.js

我一直在等待代码的一部分完成后才能运行另一部分的问题, 第1部分如何在第2部分之前完成?

var uidArray = [];
// Part 1
admin.auth().listUsers(1000).then(result => {
    result.users.forEach(userRecord => {
        uidArray.push(userRecord.uid);
        console.log("pushing to uid array user " + userRecord.uid);
    });
    return;
}).catch(error => {
    console.log("Error listing users:" + error);
});
uidArray.forEach(uid => {
    // Part 2 of the code
});

3 个答案:

答案 0 :(得分:1)

您可以使用async-await进行更好的数据操作。但是,默认情况下,forEach是异步的,它不能等到每个完成都可以在下面使用带有try-catch块的async-await来使用。

try{
    var uidArray = [];
    const result = await admin.auth().listUsers(1000);
    for(const userRecord of result.users) {
        uidArray.push(userRecord.uid);
        console.log("pushing to uid array user " + userRecord.uid);
    }
    uidArray.forEach(uid => {
        // Part 2 of the code
    });
} catch(err) {
console.log(err);
}

答案 1 :(得分:0)

var uidArray = [];
// Part 1
admin.auth().listUsers(1000).then(result => {
    result.users.forEach(userRecord => {
        uidArray.push(userRecord.uid);
        console.log("pushing to uid array user " + userRecord.uid);
    });
    return;
}).catch(error => {
    console.log("Error listing users:" + error);
}).then(()=>{
    uidArray.forEach(uid => {
        // Part 2 of the code
    });
});

此处的关键是,您在开始诺言之后,可以保持then兑现诺言。理想情况下,您还应该在每个步骤之后返回一个承诺,但这不是必需的。

此链接具有更多信息

https://javascript.info/promise-chaining

答案 2 :(得分:0)

您可以在下面的代码中使用 async-await ,因为它对数据操作非常有用。我更喜欢for loop而不是forEach

async function test(){
  try{

     let result = await admin.auth().listUsers(1000);

     let usersArray = result.users;

     var uidArray = usersArray.map(function(item) { return item.uid; });

    // here you can loop through uidArrar either for or forEach whatever you want

     for(let i =0 ; i< uidArray.length; i++){

        // your code to be executed in second part
     }

   } catch (e) {
    //error
   }
}
test()