promise笔记

发布于:2024-04-23 ⋅ 阅读:(16) ⋅ 点赞:(0)

1.介绍

之前的异步编程都是回调函数(数据库操作、ajax、定时器、fs读取文件 )

promise是es6异步编程新的解决方案,是一个构造函数

优点:支持链式调用,可以解决回调地狱,可以指定回调函数

2.使用

function getNum(num){
    return new Promise(()=>{
        if(num>10){
            resolve(true)
        }else{
            reject(false)
        }
    )
}

getNum().then.(val=>{
    console.log(val)
    },result=>{
     console.log(result)
    }
)

3.状态

pending

resolved/fulfilled

rejected

 4.方法

4.1then方法

 
var promise = new Promise((resolve, reject) => {
  console.log("inner Promise"); // 1
  setTimeout(() => {
    resolve("Fashion Barry"); // 3
  }, 1000);
});
 
promise.then((res) => {
  console.log("res", res);
});
console.log("outer promise"); // 2
// Promise 实际是一个同步函数,then 方法才是异步
// 所以输出顺序如上

4.2 resolve方法

传一个非promise对象的值会成功返回这个值

例如:var p = Promise.resolve('111')

console.log(p) //111

传一个promise对象

4.3 reject方法

无论传什么值都会失败 但是会输出该值

var p = Promise.reject('111')
const p1=Promise.reject(new Promise((resolve,reject)=>{
        resolve("ok")
}))
console.log(p,p1)

4.4all方法(promises=>{})

promises:包含n个promise的数组

返回一个新的promise,只有所有的promise都成功才成功,有一个失败就直接失败

1.全部为成功状态
2.有一个失败

4.5race方法promises=>{})

promises:包含n个promise的数组

返回一个新的promise,第一个完成的promise的结果状态就是最终的结果状态

 

5.改变promise状态

6.问题

6.1promise设置多个回调(如果状态改变 都会执行)

6.2promise状态和回调谁先执行

  1. 同步执行时 先改变状态后执行回调
  2. 执行函数中是一个异步任务时就先执行回调,再改变状态

6.3如何先改状态再执行回调

1.同步任务

2.延迟再调用then()

6.4返回结果

  1. 如果在成功的回调中throw一个错误 会使promise的状态变为失败
  2. 回调中返回的结果是非promise类型的对象,会返回该值,状态变为成功
  3. 回调中返回的结果是promise类型的对象,返回改promise对象的结果

 6.5如何串联多个任务

 

6.6异常穿透

在最后去处理错误,中间出现了错误,也可以由最后的catch方法处理

6.7中断promise链

只有一个办法:返回一个pending状态的promise

return new Promise(()=>{})

7.async函数

返回结果是promise对象,返回状态由函数内部的return决定

8.await表达式

右侧的表达式一般为promise对象,也可以是其他值

  1. 如果表达式是promise对象,await返回的是promise成功的值
  2. 如果是其他值,直接将该值作为await的返回值

⚠️注意:

  1. await必须写在async函数中 但async函数中可以没有await
  2. 如果await右边的promise失败了会抛出异常,需要通过try...catch处理