王宝强
发布于 2023-12-08 / 0 阅读 / 0 评论 / 0 点赞

peomise介绍

简介


使用原因:解决异步回调的问题

当你进行一个操作需要用到三四个接口中的数据,你需要等到他们都有响应才能操作这个时候你的写法就要嵌套多层,后期维护起来很麻烦,而且也不直观

我们称呼上前多个异步嵌套为回调地狱

详细介绍

简单使用

new Promise(
  function (resolve, reject) {
    // 一段耗时的异步操作
    resolve('成功') // 数据处理完成
    // reject('失败') // 数据处理出错
  }
).then(
  (res) => {console.log(res)},  // 成功
  (err) => {console.log(err)} // 失败
)

Promise的两个参数

resolve:表示返回 代码块中成功状态 ,会被then方法中的第一个回调函数所接收

reject:表示返回代码块中失败状态,会被then方法中的第二个回调函数所接收

这两种状态返回的都是一个promise实例,所以才能调用then方法

Promise的三种状态

1、pending[待定]初始状态
2、fulfilled[实现]操作成功
3、rejected[被否决]操作失败
当promise状态发生改变,就会触发then()里的响应函数处理后续步骤;
promise状态一经改变,不会再变。

Promise对象的状态改变,只有两种可能:
从pending变为fulfilled
从pending变为rejected。
这两种情况只要发生,状态就凝固了,不会再变了

promise实例的方法

then()接收promise实例中返回的结果

简单实例

new Promise(
  function (resolve, reject) {
    // 一段耗时的异步操作
    resolve('成功') // 数据处理完成
    // reject('失败') // 数据处理出错
  }
).then(
  (res) => {console.log(res)},  // 成功
  (err) => {console.log(err)} // 失败
).then(
  (res)=>{ },
  (res)=>{ },
)

两个参数的介绍

第一个回调函数:接收promise实例中返回成功的结果

第二个回调函数:接收promise实例中返回的失败结果

注意点

1,且then方法返回的是一个promise实例,所以他后面还是可以使用then方法等

2,第二个回调只能接收前面实例对象中的错误,第7行的then只能捕获1-6中的错误,但是他不能捕获第一个回调函数(第8行)中的错误

3,第10行的then可以捕获到1-10中的所有错误,包括上面没办法捕获的第8行中的错误

4,then的错误捕获遵循就近原则,假如7行的then没有第二个回调,第10 行then有第二个回调,那么1-6和8-9的错误会被 12行 捕获,假如第7行中的then有第二个函数,1-6的错误直接被第9行捕获,8-9会被12捕获

catch捕获错误

1,作用和then的第二个回调类似,但比他捕获的范围广(能多捕获then中的第一个回调函数中的错误)

2,也遵循就近原则,简单来说就是能捕获从上一个catch或then中第二个回调后面的所有错误

new Promise(
  function (resolve, reject) {
    // 一段耗时的异步操作
    resolve('成功') // 数据处理完成
    // reject('失败') // 数据处理出错
  }
).then(
  (res) => {console.log(res)},  // 成功
  (err) => {console.log(err)} // 失败
).catch(
  (res)=>{
   
    
  },
)

Promise.all() 批量执行

Promise.all([p1, p2, p3])用于将多个promise实例,包装成一个新的Promise实例,返回的实例就是普通的promise
它接收一个数组作为参数
数组里可以是Promise对象,也可以是别的值,只有Promise会等待状态改变
当所有的子Promise都完成,该Promise完成,返回值是全部值得数组
有任何一个失败,该Promise失败,返回值是第一个失败的子Promise结果

//切菜
    function cutUp(){
        console.log('开始切菜。');
        var p = new Promise(function(resolve, reject){        //做一些异步操作
            setTimeout(function(){
                console.log('切菜完毕!');
                resolve('切好的菜');
            }, 1000);
        });
        return p;
    }

    //烧水
    function boil(){
        console.log('开始烧水。');
        var p = new Promise(function(resolve, reject){        //做一些异步操作
            setTimeout(function(){
                console.log('烧水完毕!');
                resolve('烧好的水');
            }, 1000);
        });
        return p;
    }

    Promise.all([cutUp(), boil()])
        .then((result) => {
            console.log('准备工作完毕');
            console.log(result);
        })

Promise.race() 类似于Promise.all() ,区别在于它有任意一个完成就算完成

let p1 = new Promise(resolve => {
        setTimeout(() => {
            resolve('I\`m p1 ')
        }, 1000)
    });
    let p2 = new Promise(resolve => {
        setTimeout(() => {
            resolve('I\`m p2 ')
        }, 2000)
    });
    Promise.race([p1, p2])
        .then(value => {
            console.log(value)
        })

finally() 无论对错都会被执行

promise
.then(result => {···})
.catch(error => {···})
.finally(() => {···});
 
//在执行完then和catch后,仍然执行finally()

Promise.resolve() 将普通数据转化为promise成功实例
Promise.reject() 将普通数据转化为promise成功实例

let obj={name:123}
obj.then()//这个时候会报错
let Pobj= Promise.resolve(obj)
Pobj.then()//这个时候就可以


评论