Clean way to wait for first true returned by Promise

后端 未结 6 767
花落未央
花落未央 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:33

    Advancing off of str's answer I would like to add the ability to provide a callback so this works on more than true/false Promises.

    Adding a callback will allow to test the result of any Promise, and return the promise that successfully matches the callback filter (which should return a true/false value).

    Promise.until = function(callback, ...promises) {
      return new Promise(function(resolve, reject) {
        promises.forEach(promise =>
          promise.then(val => callback(val) === true && resolve(val))
        )
      })
    }
    
    // Create some functions that resolve true/false
    function Promise1() {return new Promise(resolve => setTimeout(()=> resolve(false), 1000))}
    function Promise2() {return new Promise(resolve => setTimeout(()=> resolve(true), 3000))}
    function Promise3() {return new Promise(resolve => setTimeout(()=> resolve(false), 1000))}
    
    // Create som functions that resolve objects
    function Promise4() {return new Promise(resolve => setTimeout(()=> resolve({a:1}), 1000))}
    function Promise5() {return new Promise(resolve => setTimeout(()=> resolve({a:2}), 3000))}
    function Promise6() {return new Promise(resolve => setTimeout(()=> resolve({a:123}), 1000))}
    
    // Create some functions that resolve strings
    function Promise7() {return new Promise(resolve => setTimeout(()=> resolve('Brass'), 1000))}
    function Promise8() {return new Promise(resolve => setTimeout(()=> resolve('Monkey'), 500))}
    function Promise9() {return new Promise(resolve => setTimeout(()=> resolve(['Brass', 'Monkey']), 100))}
    
    // Once one resolves `true` we will catch it
    Promise.until(result => result === true, Promise1(), Promise2(), Promise3())
      .then(result => console.log(result));
    
    // Once one resolves where `a` equals 123, we will catch it
    Promise.until(result => result.a === 123, Promise4(), Promise5(), Promise6())
      .then(result => console.log(result));
      
    // Once one resolves where `a` equals 123, we will catch it
    Promise.until(result => result === 'Monkey', Promise7(), Promise8(), Promise9())
      .then(result => console.log(result));

提交回复
热议问题