Promise基础


一、Promise语法:

let promise = new Promise(function(resolve, reject) {
  // executor
});

创建Promise时需要传入函数executor(执行器)作为参数
该函数的两个参数通常都命名为resolvereject

  • resolve(value) ———— 任务成功并带有结果value
  • reject(error) ———— 失败并带有error对象

总结:executor 会自动运行并尝试执行一项工作。尝试结束后,如果成功则调用 resolve,如果出现 error 则调用 reject。

ps.新建Promise时不传入函数会报错

二、Promise属性

有两个属性 stateresult

1.state(状态)

promise是一个有状态的对象
必然处于以下三个状态之一:

  • pending
  • resolved
  • rejected

state — 最初是 “pending”,然后在 resolve 被调用时变为 “fulfilled”,或者在 reject 被调用时变为 “rejected”。

  let p1 = new Promise((resolve,reject)=>{});
  console.log(p1); // Promise <pending>

  let p2 = new Promise((resolve,reject)=>{
    resolve();
  });
  console.log(p2);  // Promise <fulfilled>

promise状态一经改变,不会再变,Promise对象的状态改变,只有两种可能:
1.从pending变为fulfilled
2.从pending变为rejected。

  let p = new Promise((resolve,reject)=>{
    reject(); 
    resolve(); // 无效
  });
  console.log(p);  // Promise <rejected>
  //Uncaught (in promise) undefined        未处理错error会报错但不影响

2.result(结果)

最初是 undefined,然后在 resolve(value) 被调用时变为 value,或者在 reject(error) 被调用时变为 error。

executor最终将Promise转移至以下状态之一
在这里插入图片描述

stateresult属性是内部的,无法直接访问他们,但是可以使用.then/.catch/.finally 方法

三、Promise 方法

1 .then

为Promise添加处理程序的主要方法,then()方法最多接受两个参数,两个参数都为函数:
onResolved 处理程序和 onRejected 处理程序

  • onResolve函数在Promise resolved后运行并接受结果
  • onRejected函数在Promise rejected后运行并接受 error
  let promise = new Promise(function(resolve, reject) {
    setTimeout(() => resolve("done!"), 1000);
  });

// resolve 运行 .then 中的第一个函数
promise.then(
  result => alert(result), // 1 秒后显示 "done!"
  error => alert(error) // 不运行
);

如果只对成功的情况感兴趣,可以给.then 只提供一个函数参数:

let promise = new Promise(resolve => {
  setTimeout(() => resolve("done!"), 1000);
});

promise.then(alert); // 1 秒后显示 "done!"

如果只想处理错误,则必须写成:
promise.then(null,f)

2 .catch

.catch是语法糖,之接收一个参数
.catch(f) == .then(null,f) 完全等价

3.finally()

.finally(f)用于添加onFinally处理程序,f 总是在promise被settled时运行:即promise被resolve或reject,可以避免.then的处理程序中出现冗余的代码

finally处理程序将结果和error传递给下一个处理程序:

new Promise((resolve, reject) => {
  throw new Error("error");
})
  .finally(() => alert("Promise ready"))
  .catch(err => alert(err));  // <-- .catch 对 error 对象进行处理

  //alert两次 : 1.Promise ready 2.Error:error

此处将error传递了下去,并没有处理Promise的结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值