Promise
文章目录
一、promise概念
链式调用
因为then
catch
都会返回promise,所以可以实现链式调用
回调地狱如何解决的
- 什么是回调地狱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) //这会造成一个死循环