异步/等待,在打印之前不等待变量填充

时间:2020-06-14 05:25:54

标签: javascript node.js async-await

async function filterusers(users){
    let usersfiltered=[]
    for(var i = 0;i < users.length; i++){
        let userref = db.collection('usernames').doc(users[i]);
        let getDoc = userref.get()
          .then(doc => {
            if (doc.exists) {
              usersfiltered.push(users[i])
            }
          })
    }
    return await usersfiltered;
}

filterusers(users).then(console.log);

我希望等待过滤的结果,但是它总是打印空白数组,即在返回结果之前。

5 个答案:

答案 0 :(得分:2)

async function filterusers(users){
    let usersfiltered=[]

    // You should use let or const instead of var.
    for(let i = 0;i < users.length; i++){
        // I believe getting doc needs await.
        let userref = await db.collection('usernames').doc(users[i]);
        await userref.get()
          .then(doc => {
            if (doc.exists) {
              usersfiltered.push(users[i])
            }
          })
    }
    return usersfiltered;
}

filterusers(users).then(console.log);

答案 1 :(得分:0)

自己解决了此问题,方法是将await移到userref.get()之前

async function filterusers(users){
    let usersfiltered=[]
    for(var i = 0;i < users.length; i++){
        let userref = db.collection('usernames').doc(users[i]);
        let getDoc = await userref.get()
          .then(doc => {
            if (doc.exists) {
              usersfiltered.push(users[i])
            }
          })
    }
    return usersfiltered;
}

filterusers(users).then(console.log);

答案 2 :(得分:0)

首先,您必须使用Array.map将用户数组转变为一个Promises(异步操作)数组:

const checkUserPromises = users.map((user) => {
  const userref = db.collection("usernames").doc(user);
  return userref.get().then((doc) => {
    if (doc.exists) {
      return user;
    } else {
      return null;
    }
  });
});

然后,您需要使用await Promises.all进行这些承诺:

const checkedUsers = await Promise.all(checkUserPromises);

最后,您可能要过滤掉不存在的用户:

const existingUsers = checkedUsers.filter((user) => user !== null);

答案 3 :(得分:0)

等待应该与诺言

async function filterusers(users) {
  let usersfiltered = [];
  for (let i = 0; i < users.length; i++) {
    let userref = db.collection("usernames").doc(users[i]);
    let getDoc = await userref.get();

    if (getDoc.exists) {
      usersfiltered.push(users[i]);
    }
  }
  return usersfiltered;
}

let filterdUsers = filterusers(users);
console.log(filterdUsers);

答案 4 :(得分:0)

首先,请勿将 async / await .then 混用。

第二,使用新的ES6 for循环,以使代码在异步/等待状态下正常工作。

async function filterusers(users) {
      let usersfiltered = [];
      filterusers(users).then(console.log);

      for (const user of users) {
        let userref = db.collection('usernames').doc(user);
        const doc = await userref.get();
        if (doc.exists) {
          usersfiltered.push(user);
        }
      }
      return await usersfiltered;
    }