javascript - 如何在某个条件下停止 js promise.all()?
问题描述
我有这段代码
let promiseList = []
for (let i in data) {
let promise = checkIfMember(data[i].tg_id, chatId).then(res => {
if (res) {
//if the user has a undefined username it won't be rained
if (data[i].username != "undefined") {
console.log(data[i].username)
members.push([data[i].tg_id, data[i].username])
}
}
}).catch(err => {
console.log(err)
})
promiseList.push(promise)
}
return Promise.all(promiseList).then((res) => {
//list of members that are in the room , we randomize it before returning
shuffleArray(members)
if(numberOfUsers > members.length){
return[false, members.length]
}else{
members = members.slice(0,numberOfUsers)
return [true, members]
}
});
基本上我有一个正在填写的承诺清单。然后所有这些都用 promiseAll 执行。问题是我不希望所有这些都执行,我想做这样的事情:
let promiseList = []
let validmembers = 0;
for (let i in data) {
let promise = checkIfMember(data[i].tg_id, chatId).then(res => {
if (res) {
//if the user has a undefined username it won't be rained
if (data[i].username != "undefined") {
console.log(data[i].username)
members.push([data[i].tg_id, data[i].username])
//stop there the execution
validmembers++;
if(validmembers == numberOfUsers){
return;
}
}
}
}).catch(err => {
console.log(err)
})
promiseList.push(promise)
}
return Promise.all(promiseList).then((res) => {
//list of members that are in the room , we randomize it before returning
shuffleArray(members)
if(numberOfUsers > members.length){
return[false, members.length]
}else{
members = members.slice(0,numberOfUsers)
return [true, members]
}
});
但问题是承诺是异步的,所以承诺列表的填充不会停止。我将如何解决这个问题?
解决方案
由于承诺,您似乎希望members
数组中的条目不超过条目。numberOfUsers
由于 Promise 是异步运行的,因此您无法停止checkIfMember
调用该函数,但在其then
函数内部,您可以避免像这样累积更多成员:
// don't use `!== "undefined"` unless it can actually be the string "undefined"
if (data[i].username) {
if (members.length < numberOfUsers) {
console.log(data[i].username);
members.push([data[i].tg_id, data[i].username]);
}
}
通过仅members
在尚未满时推送,您将避免添加更多,numberOfUsers
并且不需要slice
稍后再做。
相反,如果你想在收集到足够多的时候避免整个 Promise 工作,那么你可以像这样序列化它们:
async function yourFunction() {
for (let i in data) {
if (members.length < numberOfUsers) {
// don't continue to the next 'i' until this one is done
await checkIfMember(data[i].tg_id, chatId)
.then(res => {
if (res) {
//if the user has a undefined username it won't be rained
if (data[i].username != "undefined") {
console.log(data[i].username);
members.push([data[i].tg_id, data[i].username]);
}
}
})
.catch(err => {
console.log(err);
});
} else {
break; // no need to continue once members is full
}
}
return [true, members];
}
推荐阅读
- python - __str__ 返回非字符串(字节类型)
- r - 在 R 中创建 Fama French 3 因素回归循环
- java - 如何在 Dynamics 365 Finance and Operations 中删除具有特殊字符的 DataEntity 条目
- python - 在 VM 上运行浏览器(非无头)
- javascript - 您能否解释一下为什么我们需要检查“DELETE”请求的状态是否为 200,以及为什么我们不必对“PUT”请求进行检查?
- swift - UICollectionViewListCell 附件顶部尾随放置
- sql - X 轴条形图 Grafana 上的标签
- php - Smarty::$_tpl_vars - 未定义属性 - Smarty 3 中支持 _tpl_vars
- javascript - 在 JavaScript 中混合 zlib 和 fflate 进行压缩?
- reactjs - Redux Toolkit - 使用 Axios 链接依赖的 post 请求