Promise

本文深入探讨JavaScript中的Promise,它用于管理异步操作,确保按照预期顺序执行。Promise有pending、fulfilled和rejected三种状态,一旦状态改变不可逆转。通过链式调用then方法,我们可以处理Promise的解决或拒绝状态,并使用catch捕获错误。finally方法则无论Promise结果如何都会执行。在处理异步任务时,Promise提供了强大的控制流管理能力。

JavaScript 中存在很多异步操作,Promise异步操作队列化,按照期望的顺序执行,返回符合预期的结果。可以通过链式调用多个 Promise 达到我们的目的。
1.异步状态
Promise包含*pending、fulfilled、rejected三种状态。
pending 指初始等待状态,初始化 promise 时的状态
resolve 指已经解决,将 promise 状态设置为fulfilled***
reject 指拒绝处理,将 promise 状态设置为
rejected

promise 是生产者,通过 resolvereject 函数告之结果
promise 非常适合需要一定执行时间的异步任务
状态一旦改变将不可更改

1.1动态改变
第一种情况:p1的状态是rejected
p2返回了
p1
,所以
p2
的状态已经变得没有意义。那么后面的then是对p1状态的处。

  const p1 = new Promise((resolve, reject) => {
      // resolve("fulfilled");
      reject("rejected");
    });//
    const p2 = new Promise((resolve,reject)=>{
      resolve(p1);
    }).then(
      value =>{
        console.log(value);
      },
      reason=>{
        console.log(reason);//rejected
      }
    )const p1 = new Promise((resolve,reject)=>{
     reject("rejected");
})

第二种情况 :p1(promise) 的resolve 参数是一个 p2(promise),p1的状态将被改变为p2的状态

 const p1 = new Promise((resolve,reject)=>{
    resolve(
      new Promise((s,e)=>{
        s("成功");
      })
    );
  }).then(msg=>{
    console.log(msg);//成功
  });

第三种情况P1(promise)做为参数传递时,需要等到p1执行完才可以继承,下面的p2需要等到p1执行完成

const p1 = new Promise((resolve, reject) => {
setTimeout(() => {
  resolve("操作成功");
}, 2000);
});
const p2 = new Promise((resolve, reject) => {
resolve(p1);
}).then(
**加粗样式**msg => {
  console.log(msg);//操作成功
},
error => {
  console.log(error);
}
);

2. then
一个promise 提供一个then方法访问promise的结果,then 用于定于当promise 状态发生改变是的处理 。

2.1 语法说明

promise.then(onFulfilled, onRejected)

onFulfilled 函数处理 fulfilled 状态, onRejected函数处理 rejected 状态

1.onFulfilled 或 onRejected 不是函数将被忽略
2.两个函数只会被调用一次
3.onFulfilled 在 promise 执行成功时调用,如果只关心成功则不需要传递 then 的第二个参数
4.onRejected 在 promise 执行拒绝时调用,如果只关心失败时状态,then 的第一个参数传递 null
5.promise 传向then的传递值,如果then没有可处理函数,会一直向后传递

let p1 = new Promise((resolve, reject) => {
	reject("rejected");
})
.then()
.then(
  null,
  f => console.log(f)//rejected
);

2.2 链式调用
每次的then 都是一个全新的状态,默认的then返回的promise状态是fulfilled;

new Promise((resolve, reject) => {
  reject();
})
.then(
  resolve => console.log("fulfilled"),
  reject => console.log("rejected")//  rejected
)
.then(
  resolve => console.log("fulfilled"),//  fulfilled
  reject => console.log("rejected")
)
.then(
  resolve => console.log("fulfilled"),//  fulfilled
  reject => console.log("rejected")
);
  


如果then返回promise时,后面的then就是对返回的promise的处理,需要等待promise变更状态后执行

  let promise = new Promise(resolve => resolve());
let p1 = promise.then(() => {
  return new Promise(resolve => {
    setTimeout(() => {
      console.log(`p1`);
      resolve();
    }, 2000);
  });
}).then(() => {
  return new Promise((a, b) => {
    console.log(`p2`);
  });
});
  

3.catch
catch用于失败状态的处理函数,等同于 then(null,reject){}
catch 可以捕获之前所有 promise 的错误,所以建议将 catch 放在最后。
下例中 catch 也可以捕获到了第一个 then 返回 的 promise 的错误。

new Promise((resolve, reject) => {
  resolve();
})
.then(() => {
  return new Promise((resolve, reject) => {
    reject(".then ");
  });
})
.then(() => {})
.catch(msg => {
  console.log(msg);//.then
});

catch 也可以捕获对 then 抛出的错误处理

new Promise((resolve, reject) => {
  resolve();
})
.then(msg => {
  throw new Error("这是then 抛出的错误");
})
.catch(() => {
  console.log("33");
});

4.finally
无论状态是resolve 或 reject 都会执行此动作,finally 与状态无关。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值