什么是 Promise?
Promise 是 JavaScript 中用来处理异步操作的一种解决方案。它可以让我们更优雅地处理异步代码,避免回调地狱,提高代码可读性和可维护性。
Promise 的三种状态
Promise 有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。
当 Promise 还在进行中时,它的状态是 pending,此时 Promise 还没有得到结果。
当 Promise 成功完成时,它的状态变为 fulfilled,并返回一个值。
当 Promise 失败时,它的状态变为 rejected,并返回一个错误信息。
Promise 的基本用法
Promise 的基本用法是通过 new Promise() 创建一个 Promise 对象,然后在 Promise 对象内部进行异步操作。在异步操作完成后,通过调用 resolve() 或 reject() 方法将 Promise 对象的状态设置为 fulfilled 或 rejected。
const promise = new Promise((resolve, reject) => { // 异步操作 setTimeout(() => { const random = Math.random(); if (random > 0.5) { resolve('成功'); } else { reject('失败'); } }, 1000); }); promise.then((value) => { console.log(value); }).catch((error) => { console.log(error); });
上面的代码中,我们通过 new Promise() 创建了一个 Promise 对象,然后在异步操作中模拟了一个随机的结果,当结果大于 0.5 时,调用 resolve() 方法设置 Promise 对象的状态为 fulfilled,否则调用 reject() 方法设置 Promise 对象的状态为 rejected。
在 Promise 对象中,我们通过 then() 方法和 catch() 方法来处理 Promise 对象的状态变化。当 Promise 对象的状态变为 fulfilled 时,then() 方法会被调用,传入的参数是异步操作的结果;当 Promise 对象的状态变为 rejected 时,catch() 方法会被调用,传入的参数是错误信息。
Promise 的链式调用
Promise 还支持链式调用,我们可以在 then() 方法中返回一个新的 Promise 对象,这个新的 Promise 对象可以继续进行异步操作,然后再返回一个新的 Promise 对象,以此类推。
const promise = new Promise((resolve, reject) => { // 异步操作 setTimeout(() => { const random = Math.random(); if (random > 0.5) { resolve('成功'); } else { reject('失败'); } }, 1000); }); promise.then((value) => { console.log(value); return new Promise((resolve, reject) => { // 异步操作 setTimeout(() => { const random = Math.random(); if (random > 0.5) { resolve('成功2'); } else { reject('失败2'); } }, 1000); }); }).then((value) => { console.log(value); }).catch((error) => { console.log(error); });
上面的代码中,我们在第一个 then() 方法中返回了一个新的 Promise 对象,这个新的 Promise 对象进行了第二个异步操作。当第二个异步操作完成时,第二个 then() 方法会被调用,传入的参数是第二个异步操作的结果。
Promise.all() 和 Promise.race()
Promise 还提供了两个静态方法:Promise.all() 和 Promise.race()。
Promise.all() 接收一个 Promise 对象数组作为参数,当数组中所有的 Promise 对象都变为 fulfilled 时,Promise.all() 返回一个新的 Promise 对象,传入的参数是一个包含所有 Promise 对象结果的数组;当数组中有一个 Promise 对象变为 rejected 时,Promise.all() 返回一个 rejected 状态的 Promise 对象,传入的参数是第一个变为 rejected 状态的 Promise 对象的错误信息。
const promise1 = new Promise((resolve, reject) => { // 异步操作 setTimeout(() => { resolve('成功1'); }, 1000); }); const promise2 = new Promise((resolve, reject) => { // 异步操作 setTimeout(() => { resolve('成功2'); }, 2000); }); Promise.all([promise1, promise2]).then((values) => { console.log(values); }).catch((error) => { console.log(error); });
上面的代码中,我们将两个 Promise 对象放入 Promise.all() 中,当两个 Promise 对象都变为 fulfilled 时,Promise.all() 返回一个新的 Promise 对象,传入的参数是一个包含两个 Promise 对象结果的数组。
Promise.race() 接收一个 Promise 对象数组作为参数,当数组中有一个 Promise 对象变为 fulfilled 或 rejected 时,Promise.race() 返回一个新的 Promise 对象,传入的参数是第一个变为 fulfilled 或 rejected 状态的 Promise 对象的结果或错误信息。
const promise1 = new Promise((resolve, reject) => { // 异步操作 setTimeout(() => { resolve('成功1'); }, 1000); }); const promise2 = new Promise((resolve, reject) => { // 异步操作 setTimeout(() => { reject('失败2'); }, 2000); }); Promise.race([promise1, promise2]).then((value) => { console.log(value); }).catch((error) => { console.log(error); });
上面的代码中,我们将两个 Promise 对象放入 Promise.race() 中,当两个 Promise 对象中有一个变为 fulfilled 或 rejected 时,Promise.race() 返回一个新的 Promise 对象,传入的参数是第一个变为 fulfilled 或 rejected 状态的 Promise 对象的结果或错误信息。
总结
Promise 是一种用来处理异步操作的解决方案,它可以让我们更优雅地处理异步代码,避免回调地狱,提高代码可读性和可维护性。Promise 有三种状态:pending、fulfilled 和 rejected。Promise 还支持链式调用、Promise.all() 和 Promise.race()。我们可以根据具体的业务需求选择相应的使用方法。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65c43479add4f0e0ffea8f58