Promise 是一种广泛应用于异步编程的技术,它可以优雅地处理异步操作,为我们的代码提供了更简洁的解决方案。在使用 Promise 时,我们最常用到的就是 then()
和 catch()
方法,但它还有一些其他重要的方法,其中就包括 all()
和 race()
。
all()
方法
Promise.all()
方法可以将多个 Promise 对象合并成一个 Promise 对象,并等待它们全部完成。当所有 Promise 对象都成功时,它返回一个成功结果数组,数组中的每个元素对应了每个 Promise 对象的成功结果;当任意一个 Promise 对象失败时(立即抛出异常),它返回第一个失败 Promise 对象的错误结果。下面是一个例子:
const p1 = Promise.resolve('hello'); const p2 = Promise.resolve('world'); const p3 = Promise.reject(new Error('error')); Promise.all([p1, p2, p3]) .then(result => console.log(result)) .catch(error => console.log(error.message)); // Error: error
这段代码中,我们创建了三个 Promise 对象:p1
和 p2
分别成功返回了 "hello" 和 "world",而 p3
失败返回了一个包含错误信息的 Error 对象。我们将它们合并到了一个 Promise 对象中,然后使用 then()
和 catch()
方法处理它的结果。
最后我们可以看到,由于 p3
失败了,Promise.all() 函数直接抛出错误,并传递给了 catch() 函数。因此代码会在此模仿并输出 "Error: error"。
race()
方法
Promise.race()
方法也将多个 Promise 对象合并成一个 Promise 对象,但是它的返回结果与所有 Promise 对象中最先结束的那个结果相同。无论是成功还是失败。下面是一个例子:
const p1 = new Promise(resolve => setTimeout(resolve, 1000, 'hello')); const p2 = new Promise(resolve => setTimeout(resolve, 2000, 'world')); Promise.race([p1, p2]) .then(result => console.log(result)) // 'hello' .catch(error => console.log(error));
在这个例子中,我们创建了两个 Promise 对象,它们分别在 1 秒和 2 秒之后分别成功返回了 "hello" 和 "world"。在使用 race()
方法将它们合并后,我们便得到了一个新的 Promise 对象。由于 p1
的执行时间比p2
要快,因此最终的结果是 "hello"。
需要注意的是,当任意一个 Promise 对象失败后,race()
方法会立即返回失败结果(即第一个抛出异常的 Promise 对象的错误结果)。因此,在使用 race()
方法时我们需要非常小心,避免出现无法处理的错误情况。
总结
Promise.all()
和 Promise.race()
方法都可以将多个 Promise 对象合并成一个新的 Promise 对象,它们的作用有所不同。Promise.all()
返回的新对象的结果与所有 Promise 对象成功时传递的结果数组相关,若其中任意一个 Promise 对象抛出异常则会直接返回异常。而 Promise.race()
返回的新对象的结果是最先完成的 Promise 对象的结果,不论它是成功还是失败。
参考
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/646b0801968c7c53b0a79d07