在 JavaScript 中,Promise 是一种处理异步操作的方式。Promise 可以让我们更加方便地进行异步编程,而 Promise.prototype.then() 方法是 Promise 的核心方法之一。在本文中,我们将详细介绍 Promise.prototype.then() 方法的使用和原理。
基本用法
Promise.prototype.then() 方法用于指定 Promise 对象的状态改变时的回调函数。它接收两个参数:第一个参数是状态变为 resolved 时的回调函数,第二个参数是状态变为 rejected 时的回调函数。这两个回调函数都可以省略,如果省略,则相应的处理函数会被忽略。
promise.then(onResolved, onRejected);
其中,onResolved 和 onRejected 都是函数类型。onResolved 接收 Promise 的返回值作为参数,onRejected 接收 Promise 的错误信息作为参数。
下面是一个简单的例子,展示 Promise.prototype.then() 方法的基本用法:
// javascriptcn.com 代码示例 let promise = new Promise((resolve, reject) => { let num = Math.random(); if (num > 0.5) { resolve(num); } else { reject('Error'); } }); promise.then( result => console.log(`Resolved: ${result}`), error => console.log(`Rejected: ${error}`) );
在上述代码中,我们创建了一个 Promise 对象,它随机生成一个数值并根据其大小决定 Promise 的状态。如果生成的数值大于 0.5,则 Promise 的状态为 resolved,否则状态为 rejected。我们在 Promise.prototype.then() 方法中指定了 resolved 和 rejected 状态的回调函数,并在控制台中输出相应的信息。
链式调用
Promise.prototype.then() 方法返回一个新的 Promise 对象,因此它可以被链式调用。在链式调用中,每个 Promise 对象的状态变化都会影响后面的 Promise 对象。如果前一个 Promise 对象的状态为 resolved,那么后面的 Promise 对象就会接收到前一个 Promise 对象的返回值;如果前一个 Promise 对象的状态为 rejected,那么后面的 Promise 对象就会接收到前一个 Promise 对象的错误信息。
下面是一个简单的例子,展示 Promise.prototype.then() 方法的链式调用:
let promise = new Promise(resolve => resolve(2)); promise .then(result => result * 2) .then(result => result * 2) .then(result => console.log(result));
在上述代码中,我们创建了一个 Promise 对象,它的状态为 resolved,并返回了数值 2。然后我们在 Promise.prototype.then() 方法中指定了三个回调函数,每个回调函数都将前一个 Promise 对象的返回值乘以 2。最终,我们在控制台中输出了最后一个 Promise 对象的返回值 8。
返回值
Promise.prototype.then() 方法返回一个新的 Promise 对象,这个新的 Promise 对象的状态和值由前一个 Promise 对象的状态和值决定。如果前一个 Promise 对象的状态为 resolved,那么新的 Promise 对象的状态也为 resolved,并接收前一个 Promise 对象的返回值;如果前一个 Promise 对象的状态为 rejected,那么新的 Promise 对象的状态也为 rejected,并接收前一个 Promise 对象的错误信息。
下面是一个简单的例子,展示 Promise.prototype.then() 方法的返回值:
let promise1 = new Promise(resolve => resolve(2)); let promise2 = promise1.then(result => result * 2); console.log(promise1); // Promise {<resolved>: 2} console.log(promise2); // Promise {<resolved>: 4}
在上述代码中,我们创建了一个 Promise 对象 promise1,它的状态为 resolved,并返回了数值 2。然后我们在 Promise.prototype.then() 方法中指定了一个回调函数,它将前一个 Promise 对象的返回值乘以 2。这个回调函数返回了一个新的 Promise 对象 promise2,它的状态和值由前一个 Promise 对象的状态和值决定。最终,我们在控制台中输出了两个 Promise 对象,它们的状态和值分别为 resolved 和 2 和 resolved 和 4。
错误处理
在 Promise.prototype.then() 方法中,我们可以通过第二个参数来指定 rejected 状态的回调函数。如果前一个 Promise 对象的状态为 rejected,那么这个回调函数就会被调用,并接收前一个 Promise 对象的错误信息作为参数。
下面是一个简单的例子,展示 Promise.prototype.then() 方法的错误处理:
let promise = new Promise((resolve, reject) => reject('Error')); promise .then(result => console.log(`Resolved: ${result}`), error => console.log(`Rejected: ${error}`)) .then(result => console.log(`Resolved: ${result}`), error => console.log(`Rejected: ${error}`));
在上述代码中,我们创建了一个 Promise 对象,它的状态为 rejected,并返回了错误信息 Error。然后我们在 Promise.prototype.then() 方法中指定了 resolved 和 rejected 状态的回调函数。由于前一个 Promise 对象的状态为 rejected,因此第二个回调函数会被调用,并接收错误信息 Error 作为参数。最终,我们在控制台中输出了错误信息 Error 和 undefined。
异常处理
在 Promise.prototype.then() 方法中,如果前一个 Promise 对象的状态为 rejected,并且没有指定 rejected 状态的回调函数,那么异常就会被抛出。我们可以通过 Promise.prototype.catch() 方法来捕获这个异常。
下面是一个简单的例子,展示 Promise.prototype.catch() 方法的异常处理:
let promise = new Promise((resolve, reject) => reject('Error')); promise .then(result => console.log(`Resolved: ${result}`)) .catch(error => console.log(`Caught: ${error}`));
在上述代码中,我们创建了一个 Promise 对象,它的状态为 rejected,并返回了错误信息 Error。然后我们在 Promise.prototype.then() 方法中省略了 rejected 状态的回调函数,因此异常就会被抛出。我们在 Promise.prototype.catch() 方法中捕获了这个异常,并输出了错误信息 Error。
总结
在本文中,我们详细介绍了 Promise.prototype.then() 方法的使用和原理。我们了解了 Promise.prototype.then() 方法的基本用法、链式调用、返回值、错误处理和异常处理。希望本文能对你理解 Promise 有所帮助,并指导你在实际应用中正确使用 Promise。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65766acdd2f5e1655dfabcda