Promise 是 JavaScript 中一种异步编程的解决方案,它可以帮助我们在异步操作完成后进行回调处理,避免了回调地狱的问题。而 Promise 中的 then 和 catch 方法是 Promise 最重要的方法之一,本文将详细介绍它们的使用方法以及注意事项。
Promise 基本概念
在开始讲解 then 和 catch 方法之前,我们先来了解一下 Promise 的基本概念。
Promise 对象表示一个异步操作的最终完成或失败,并且它会返回一个结果值。Promise 对象有三种状态,分别是 pending(进行中)、fulfilled(已成功)和 rejected(已失败)。当 Promise 对象的状态变为 fulfilled 或 rejected 时,Promise 对象就被称为 settled(已定型)。Promise 对象一旦 settled,就不能再改变状态。
then 方法
then 方法是 Promise 中最常用的方法之一,它用来指定 Promise 对象的成功和失败的回调函数。then 方法有两个参数,分别是成功的回调函数和失败的回调函数。
promise.then(onFulfilled, onRejected)
其中,onFulfilled 是 Promise 对象成功时的回调函数,它会接收 Promise 对象 resolve 方法传递过来的值作为参数。onRejected 是 Promise 对象失败时的回调函数,它会接收 Promise 对象 reject 方法传递过来的错误信息作为参数。
then 方法可以链式调用,即多个 then 方法串联起来,每个 then 方法都会返回一个新的 Promise 对象,这样就可以实现多个异步操作的顺序执行。
promise.then(onFulfilled1, onRejected1) .then(onFulfilled2, onRejected2) .then(onFulfilled3, onRejected3)
在 then 方法中,如果成功的回调函数和失败的回调函数都没有被指定,那么 Promise 对象的状态就会被传递到下一个 then 方法中。
promise.then().then(onFulfilled, onRejected)
catch 方法
catch 方法是 then 方法的语法糖,它用来指定 Promise 对象的失败的回调函数,它接收一个参数,即 Promise 对象 reject 方法传递过来的错误信息。
promise.catch(onRejected)
catch 方法也可以链式调用,它会返回一个新的 Promise 对象,这样就可以实现多个异步操作的顺序执行。
promise.catch(onRejected1) .then(onFulfilled2, onRejected2) .catch(onRejected3)
在 catch 方法中,如果没有指定失败的回调函数,那么 Promise 对象的错误信息就会被传递到下一个 catch 方法中。
promise.catch().catch(onRejected)
注意事项
在使用 then 和 catch 方法时,需要注意以下几点:
- then 方法和 catch 方法都会返回一个新的 Promise 对象,因此可以链式调用多个 then 方法和 catch 方法。
- then 方法和 catch 方法可以多次调用,但是只有第一次调用有效。
- then 方法和 catch 方法中的回调函数都是异步执行的,即会被放到事件循环队列中等待执行。
- then 方法和 catch 方法中的回调函数可以返回一个新的 Promise 对象,这样就可以实现异步操作的嵌套执行。
- then 方法和 catch 方法中的回调函数可以返回一个普通的值,这样就可以实现同步操作的顺序执行。
示例代码
下面是一个使用 Promise、then 和 catch 方法的示例代码,它实现了异步读取文件并打印内容的功能。
// www.javascriptcn.com code example
const fs = require('fs')
function readFile(filePath) {
return new Promise((resolve, reject) => {
fs.readFile(filePath, 'utf-8', (err, data) => {
if (err) {
reject(err)
} else {
resolve(data)
}
})
})
}
readFile('test.txt')
.then(data => {
console.log(data)
})
.catch(err => {
console.error(err)
})在上面的代码中,我们使用 Promise 封装了 fs.readFile 方法,然后使用 then 方法指定了成功的回调函数,使用 catch 方法指定了失败的回调函数。当文件读取成功时,成功的回调函数会打印文件内容;当文件读取失败时,失败的回调函数会打印错误信息。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67d5028ea941bf713494c527