[英]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.