关于Promise的一些问题

ES6 入门教程

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 对象,以链式调用的方式来处理异步操作,避免了层层嵌套的回调函数

优点:

  1. 异步操作更可读和易于理解:Promise 的链式调用使代码的结构更清晰,可以清晰地表达出异步操作的顺序。

  2. 更好地处理异步操作的结果或错误:Promise 使用 .then() 和 .catch() 方法来处理异步操作的结果或错误,使代码更具可读性和可维护性。

  3. 解决回调地狱问题:Promise 通过链式调用解决了回调地狱问题,可以避免多层嵌套的回调函数带来的代码可读性、可维护性等问题。

  4. 提供了更多的操作方法:Promise 提供了一系列的操作方法,如 .all().race().finally() 等,可以更灵活地处理多个异步操作。


resolve,reject和then,catch区别?

  1. resolve:resolve 是 Promise 对象的方法之一,用于将 Promise 对象的状态从 pending(进行中)改为 fulfilled(已成功)。resolve 方法接受一个参数,表示异步操作成功的结果。例如,resolve(value) 中的 value 可以是任意类型的值。

  2. reject:reject 也是 Promise 对象的方法之一,用于将 Promise 对象的状态从 pending(进行中)改为 rejected(已失败)。reject 方法接受一个参数,表示异步操作的错误信息或异常。例如,reject(error) 中的 error 可以是 Error 对象或表示错误的字符串。

  3. then:then 是 Promise 对象的方法,用于注册当 Promise 对象状态变为 fulfilled(已成功)时的回调函数。then 方法接受两个参数,第一个参数是处理成功状态的回调函数,第二个参数是处理失败状态的回调函数(可选)。

  4. 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);
})
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值