簡體   English   中英

如何等待由從承諾中獲取的數據填充的數組被填充?

[英]How to await an array that is filled by data fetched from promises to get filled?

我目前有一些必須填充數組的承諾,但問題是我無法使用該數組進行操作,因為它在承諾完成之前被讀取,並且我無法以任何方式記錄它。 我已經閱讀了有關 promise.all 的信息,但我不明白如何實現它。 任何想法?

    //array to be filled
  var members = []
 //function to check if an user is a member 
  function checkIfMember(uid, cid){
    return ctx.getChatMember(uid, cid).then(data =>{
        if(data.status == "member"){
            return true;
        }else{
            return false;
        }
    }).catch(err =>{
        console.log(err)
    })
  }

  //Returns all the user and the number of users
  db.query("SELECT * FROM users").then(data => {
      console.log(data)
      console.log(data.length)
      //in the returned user list we check that each member is in the group, if it is, we push the member to an array
     for(let i in data){
         checkIfMember(data[i].tg_id,chatid).then(res =>{
             if(res){
                 members.push(data[i].tg_id)

             }
         }).catch(err =>{
             console.log(err)
         })
     }
     console.log(members) //EMPTY --> how or where do i log this? !!QUESTION <<<<<------------
    }).catch(err => {
      console.log(err)
  })

您需要處理一個承諾列表,每個 promise (即checkIfMemeber )都將被推送到該數組。

then ,您可以使用Promise.all當列表中的所有承諾都得到解決時觸發:

  //Returns all the user and the number of users
  db.query("SELECT * FROM users").then(data => {
      console.log(data)
      console.log(data.length)
      //in the returned user list we check that each member is in the group, if it is, we push the member to an array
     let promiseList = []
     for(let i in data){
         let promise = checkIfMember(data[i].tg_id,chatid).then(res =>{
             if(res){
                 members.push(data[i].tg_id)

             }
         }).catch(err =>{
             console.log(err)
         })
         promiseList .push(promise)
     }

     Promise.all(promiseList).then((res) => {
        console.log(members);
     });

    }).catch(err => {
      console.log(err)
  })

這是可能的解決方案之一:

//array to be filled
var members = []
//function to check if an user is a member 
function checkIfMember(uid, cid) {
    return ctx.getChatMember(uid, cid).then(data => {
        return data.status === "member";
    }).catch(err => {
        console.log(err)
    })
}

//Returns all the user and the number of users
db.query("SELECT * FROM users").then(data => {
    console.log(data)
    console.log(data.length)
    const promises = data.map(user => {
        return checkIfMember(user.tg_id, chatid).then(isMember => {
            if (isMember) {
                members.push(user.tg_id);
            }
        })
    });

    Promise.all(promises).then(() => {
        console.log(members) 
    });
}).catch(err => {
    console.log(err)
})

但是這段代碼仍然不是很好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM