尽解Promise基础(三):异步编程从此轻轻松松
2023-11-28 16:42:08
## Promise.prototype.then()方法
Promise.prototype.then()方法是实例Promise对象上的一个方法,它接受最多两个参数:
- Promise对象状态变为fulfilled或rejected时的回调函数。
- Promise对象状态变为rejected时的回调函数。
then()方法的作用是,当Promise对象的状态变为fulfilled时,调用第一个回调函数,并将fulfilled时的值作为参数传入该回调函数;当Promise对象的状态变为rejected时,调用第二个回调函数,并将rejected时的原因作为参数传入该回调函数。
## then()方法的第一个参数
then()方法的第一个参数是一个函数,当Promise对象的状态变为fulfilled时,这个函数会被调用。这个函数接受一个参数,这个参数就是Promise对象在fulfilled时返回的值。
const promise = new Promise((resolve, reject) => {
setTimeout(() => {
resolve("Hello, world!");
}, 2000);
});
promise.then((value) => {
console.log(value); // 输出: "Hello, world!"
});
## then()方法的第二个参数
then()方法的第二个参数也是一个函数,当Promise对象的状态变为rejected时,这个函数会被调用。这个函数接受一个参数,这个参数就是Promise对象在rejected时返回的原因。
const promise = new Promise((resolve, reject) => {
setTimeout(() => {
reject(new Error("Error!"));
}, 2000);
});
promise.then(
(value) => {
console.log(value); // 不会被执行
},
(reason) => {
console.log(reason); // 输出: Error: Error!
}
);
## then()方法的链式调用
then()方法可以链式调用,这意味着你可以连续调用then()方法来处理多个异步操作。
const promise = new Promise((resolve, reject) => {
setTimeout(() => {
resolve("Hello, world!");
}, 2000);
});
promise
.then((value) => {
console.log(value); // 输出: "Hello, world!"
return value.toUpperCase();
})
.then((value) => {
console.log(value); // 输出: "HELLO, WORLD!"
});
## 处理异步操作
Promise对象可以用来处理异步操作,这使得JavaScript代码更加易于编写和维护。
function fetchUserData(userId) {
return new Promise((resolve, reject) => {
setTimeout(() => {
const user = {
id: userId,
name: "John Doe",
};
resolve(user);
}, 2000);
});
}
fetchUserData(123)
.then((user) => {
console.log(user); // 输出: { id: 123, name: "John Doe" }
})
.catch((error) => {
console.log(error); // 不会被执行
});
## then()方法中的第二个参数
then()方法的第二个参数可以用来处理Promise对象被rejected的情况。
function fetchUserData(userId) {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (userId === 123) {
resolve({
id: userId,
name: "John Doe",
});
} else {
reject(new Error("User not found"));
}
}, 2000);
});
}
fetchUserData(123)
.then((user) => {
console.log(user); // 输出: { id: 123, name: "John Doe" }
})
.catch((error) => {
console.log(error); // 不会被执行
});
fetchUserData(456)
.then((user) => {
console.log(user); // 不会被执行
})
.catch((error) => {
console.log(error); // 输出: Error: User not found
});
## catch方法
catch方法是then()方法的简写形式,它只接受一个参数,这个参数是Promise对象状态变为rejected时的回调函数。
const promise = new Promise((resolve, reject) => {
setTimeout(() => {
reject(new Error("Error!"));
}, 2000);
});
promise.catch((reason) => {
console.log(reason); // 输出: Error: Error!
});
## finally方法
finally方法无论Promise对象的状态是fulfilled还是rejected,都会被调用。
const promise = new Promise((resolve, reject) => {
setTimeout(() => {
resolve("Hello, world!");
}, 2000);
});
promise
.then((value) => {
console.log(value); // 输出: "Hello, world!"
})
.catch((reason) => {
console.log(reason); // 不会被执行
})
.finally(() => {
console.log("Finally!"); // 输出: "Finally!"
});
## 结论
Promise对象是一个非常强大的工具,它可以用来处理异步操作,使JavaScript代码更加易于编写和维护。then()方法、catch方法和finally方法是Promise对象上的三个重要方法,它们可以用来处理Promise对象的状态变化。