学习promise,这一篇就够了~

本文详细介绍了JavaScript中的Promise机制,包括概念、链式调用、解决回调地狱问题的方法,以及Promise API的各种用法,例如Promise.all(), Promise.any(), Promise.allSettled(), Promise.race()等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Promise

一、promise概念

1

链式调用

因为then catch都会返回promise,所以可以实现链式调用

回调地狱如何解决的

  • 什么是回调地狱2
    1. 多层嵌套的问题;
    2. 每种任务的处理结果存在两种可能性(成功或失败),那么需要在每种任务执行结束后分别处理这两种可能性,就会造成代码冗余且可读性差,维护起来麻烦。

二、promiseAPI

Promise方法描述
all接收一个iterable参数,返回一个promise,有一个失败则返回第一个失败的promise,没有失败则按参数列表顺序返回结果
allSettled参数和返回值类型同Promise.all ,不同的是,不会被任何promise结果(rejected/resolved)影响,直接按顺序返回结果
any参数和返回值类型同Promise.all ,与all意思完全相反,有一个resolved则返回成功的promise,否则返回失败。
race参数和返回值类型同Promise.all ,不论成功失败,哪个请求结果出的快,返回哪个

Promise.all()

接收一个promise的iterable类型(注:Array,Map,Set都属于ES6的iterable类型),其结果有三种,无错误返回的promise,则返回所有结果的数组(顺序为传入的参数顺序);若传入的promises存在rejected的promise(不论有几个被rejected),则直接返回第一个错的结果,不管其他的promise不管完成与否。

// 使用
const promise1 = Promise.resolve(3);
const promise2 = 42;
const promise3 = new Promise((resolve, reject) => {
  setTimeout(resolve, 100, 'foo');
});

Promise.all([promise2, promise1, promise3]).then((values) => {
  // 都成功结果只看传入顺序(若传入参数为空中则返回一个空对象)
  console.log(values);
  // expected output: Array [42, 3, "foo"]
}).catch(err=> {
  // 返回第一个rejected的信息
  console.log(err)
});

语法

Promise.all(iterable);

参数
一个可迭代对象,如 Array 或 String。
判断:
Symbol.iterator属性
如arr = [1,2,3]
arr[Symbol.iterator].next.value === 1;

返回值

  • 如果传入的参数是一个空的可迭代对象,则返回一个已完成(already resolved)状态的 Promise。
  • 如果传入的参数不包含任何 promise,则返回一个异步完成(asynchronously resolved) Promise。注意:Google Chrome 58 在这种情况下返回一个已完成(already resolved)状态的 Promise。
  • 其它情况下返回一个处理中(pending)的Promise。这个返回的 promise 之后会在所有的 promise 都完成或有一个 promise 失败时异步地变为完成或失败。 返回值将会按照参数内的 promise 顺序排列,而不是由调用 promise 的完成顺序决定。

Promise.any()

参数、返回值 与Promise.all()一致,只不过用处恰恰相反,只要有一个成功则返回成功的结果,若都失败,则返回一个rejected的请求。

Promise.allSettled()

参数与Promise.all()一致,不同的是不论何时都会拿到所有的结果,总之想得到每一个promise的结果用allSettled,依赖紧密的promise、错误直接返回的用all

Promise.race()

参数与Promise.all()一致,传入为空时一直pending,否则会返回先出结果的那个promise

Promise.prototype.then()

没啥可说的,返回一个promise,在此处理成功后的操作。

Promise.prototype.catch()

返回一个promise,在此处理失败后的操作。

Promise.prototype.finally()

不管成功或失败都会走的方法

Promise.reject()

如果在promise内调用了reject方法,会被catch捕捉到。
方法返回一个带有拒绝原因的Promise对象。

Promise.resolve()

如果在promise内调用了resolve方法,会被then捕捉到。
方法会解析一个thenable的对象,直至最终态,若遇到then中调用自己的递归,会出现死循环。

let thenable = {
  then: (resolve, reject) => {
    resolve(thenable)
  }
}

Promise.resolve(thenable)  //这会造成一个死循环

  1. promise-MDN ↩︎

  2. 精读JS系列(9b) Promise — 回调地狱、Promise构造器 ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值