promise三个状态俩个参数_实用向:使用Promise的技巧总结

本文总结了Promise的实战技巧,包括只能捕获上一级异常、then方法返回值的影响、错误恢复机制、catch与then的区别、Promise的不足以及Promise.resolve的用法。通过示例详细解释了如何使用Promise.all、Promise.race和async/await,揭示了await并行处理请求的策略。
摘要由CSDN通过智能技术生成

730034465fd113cfb1ba45759877b84f.png

1. 只能捕获来自上一级的异常

下面的两段代码有什么不同:

// Exhibit A
new Promise(function(resolve, reject) {
    
  resolve("hello world");
})
.then(
  function(str) {
    
    throw new Error("uh oh");
  },
  undefined
)
.then(
  undefined,
  function(error) {
    
    alert(error);
  }
);
// Exhibit B
new Promise(function(resolve, reject) {
    
  resolve("hello world");
})
.then(
  function(str) {
    
    throw new Error("uh oh");
  },
  function(error) {
    
    alert(error);
  }
);

在A中,当第一个 then 抛出异常时,第二个 then 能捕获到该异常,并会弹出 'uh oh'。这符合只捕获来自上一级异常的规则。

在B中,正确的回调函数和错误的回调函数在同一级,也就是说,尽管在回调中抛出了异常,但是这个异常不会被捕获。事实上,B中的错误回调只有在 promise 被 rejected 或者 promise 自身抛出一个异常时才会被执行。

引自: https://github.com/dwqs/blog/issues/1

2. 简述讲下then方法返回值

搜索MDN的结果是这样的:

当一个 Promise 完成(fulfilled)或者失败(rejected)时,返回函数将被异步调用(由当前的线程循环来调度完成)。具体的返回值依据以下规则返回。如果 then 中的回调函数:
  • 返回了一个值,那么 then 返回的 Promise 将会成为接受状态,并且将返回的值作为接受状态的回调函数的参数值。
  • 没有返回任何值,那么 then 返回的 Promise 将会成为接受状态,并且该接受状态的回调函数的参数值为 undefined
  • 抛出一个错误,那么 then 返回的 Promise 将会成为拒绝状态,并且将抛出的错误作为拒绝状态的回调函数的参数值。
  • 返回一个已经是接受状态的 Promise,那么 then 返回的 Promise 也会成为接受状态,并且将那个 Promise 的接受状态的回调函数的参数值作为该被返回的Promise的接受状态回调函数的参数值。
  • 返回一个已经是拒绝状态的 Promise,那么 then 返回的 Promise 也会成为拒绝状态,并且将那个 Promise 的拒绝状态的回调函数的参数值作为该被返回的Promise的拒绝状态回调函数的参数值。
  • 返回一个未定状态(pending)的 Promise,那么 then 返回 Promise 的状态也是未定的,并且它的终态与那个 Promise 的终态相同;同时,它变为终态时调用的回调函数参数与那个 Promise 变为终态时的回调函数的参数是相同的。

我来给上面翻译翻译:

首先,无论返回值里面是否带有Promise,但是它的本质上,还是返回一个Promise对象

比如,

  • 返回一个值
.then(value=> return "一个值")

等于

.then(value=> return new Promise((resolve,reject)=>resolve("一个值")))
  • 无返回值
.then(value=> console.log(value))

等于

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值