Promise - JavaScript | MDN (mozilla.org)
Promise是什么?(what)
异步编程的一种解决方案,用于处理异步操作的Promise
对象。
Promise 对象有三种状态:pending(进行中)、fulfilled(已成功)和 rejected(已失败)。当一个 Promise 被创建时,它的初始状态是 pending,可以通过调用 resolve
方法将其状态改为 fulfilled(成功),或者通过调用 reject
方法将其状态改为 rejected(失败)。
为什么需要Promise?(why)
Promise 的出现主要是为了解决 JavaScript 中的异步编程问题。
在传统的回调函数方式中,处理异步操作时往往会导致回调地狱(callback hell)的问题,即多个异步操作的嵌套回调导致代码看起来混乱、难以理解和维护。
Promise 提供了一种更为直观和简洁的方式来处理异步操作,让代码更易读并且易于维护。它通过将异步操作抽象为一个 Promise 对象,以链式调用的方式来处理异步操作,避免了层层嵌套的回调函数。
优点:
-
异步操作更可读和易于理解:Promise 的链式调用使代码的结构更清晰,可以清晰地表达出异步操作的顺序。
-
更好地处理异步操作的结果或错误:Promise 使用
.then()
和.catch()
方法来处理异步操作的结果或错误,使代码更具可读性和可维护性。 -
解决回调地狱问题:Promise 通过链式调用解决了回调地狱问题,可以避免多层嵌套的回调函数带来的代码可读性、可维护性等问题。
-
提供了更多的操作方法:Promise 提供了一系列的操作方法,如
.all()
、.race()
、.finally()
等,可以更灵活地处理多个异步操作。
resolve,reject和then,catch区别?
-
resolve:resolve 是 Promise 对象的方法之一,用于将 Promise 对象的状态从 pending(进行中)改为 fulfilled(已成功)。resolve 方法接受一个参数,表示异步操作成功的结果。例如,
resolve(value)
中的 value 可以是任意类型的值。 -
reject:reject 也是 Promise 对象的方法之一,用于将 Promise 对象的状态从 pending(进行中)改为 rejected(已失败)。reject 方法接受一个参数,表示异步操作的错误信息或异常。例如,
reject(error)
中的 error 可以是 Error 对象或表示错误的字符串。 -
then:then 是 Promise 对象的方法,用于注册当 Promise 对象状态变为 fulfilled(已成功)时的回调函数。then 方法接受两个参数,第一个参数是处理成功状态的回调函数,第二个参数是处理失败状态的回调函数(可选)。
-
catch:catch 是 Promise 对象的方法,用于注册当 Promise 对象状态变为 rejected(已失败)时的回调函数。catch 方法接受一个参数,即处理失败状态的回调函数。
resolve 和 reject 方法用于改变 Promise 对象的状态,从而指示异步操作的成功或失败。
then 和 catch 方法用于注册回调函数,以便在 Promise 对象状态变为 fulfilled 或 rejected 时执行相应的处理。then 方法主要用于处理成功状态,而 catch 方法主要用于处理失败状态。
promise实现原理?(how)
async,await后如何处理promise对应的catch中的异常?
在使用 async/await 时,如果要处理对应的 Promise 中的 catch 中的异常,有两种方法:
1.await与.catch()同时使用
示例:
async function myAsyncFunction() {
const result = await somePromise().catch((error) => {// 使用 await 表达式等待一个 Promise 对象
// 处理 Promise 对象 catch 中的异常
console.log(error);
});
// 处理异步操作的结果
console.log(result);
}
2.使用 try-catch 块:可以将 async 函数体内使用的 await 表达式包装在 try 块中,然后使用 catch 块捕获可能抛出的异常。
示例:
async function myAsyncFunction() {
try {
const result = await somePromise(); // 使用 await 表达式等待一个 Promise 对象
// 处理异步操作的结果
console.log(result);
} catch (error) {
// 处理 Promise 对象 catch 中的异常
console.log(error);
}
}
myAsyncFunction();
try/catch 能捕获所有异常, .catch只能捕获异步方法中reject错误
Promise(ES6)是异步编程的一种解决方案。
链式编程,当网络请求非常复杂时,就会出现回调地狱。
new Promise((resolve,reject)=>{
setTimeout(()=>{
//成功时调用resolve
resolve('Hello World')
//失败时调用reject
reject('error mesage')
},1000)
}).then((data)=>{
//非常多行处理代码
console.log(data);
console.log(data);
console.log(data);
}).catch((err)=>{
console.log(err);
})