繁体   English   中英

如何在某个条件下停止 js promise.all()?

[英]How to stop a js promise.all() on a condition?

我有这段代码

 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]
        }
    });

基本上我有一个正在填写的 promise 列表。 然后所有这些都用 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 由于承诺异步运行,您无法停止checkIfMember function,但在其内部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];
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM