Clean way to wait for first true returned by Promise

后端 未结 6 789
花落未央
花落未央 2021-01-01 09:51

I\'m currently working on something where I fire out three promises in an array. At the moment it looks something like this

var a = await Promise.all([Promis         


        
6条回答
  •  长情又很酷
    2021-01-01 10:21

    You can implement that combining Promise.race and Promise.all:

    function firstTrue(promises) {
        const newPromises = promises.map(p => new Promise(
            (resolve, reject) => p.then(v => v && resolve(true), reject)
        ));
        newPromises.push(Promise.all(promises).then(() => false));
        return Promise.race(newPromises);
    }
    

    Test for above code:

    function firstTrue(promises) {
      const newPromises = promises.map(p => new Promise(
        (resolve, reject) => p.then(v => v && resolve(true), reject)
      ));
      newPromises.push(Promise.all(promises).then(() => false));
      return Promise.race(newPromises);
    }
    
    var test = values => firstTrue(
      values.map((v) => new Promise((resolve) => {
        setTimeout(() => resolve(v), Math.round(Math.random() * 1000));
      }))
    ).then((ret) => console.log(values, ret));
    
    test([true, true, true]);
    test([false, false, false]);
    test([true, false, false]);
    test([false, true, false]);
    test([false, false, true]);

提交回复
热议问题