zoukankan      html  css  js  c++  java
  • 简述Promise Promise.then Promise.all Promise.race

    Promise

    1.什么是Promise?

    Promise 是一个对象。

    2.promise的作用?

    promise主要用于进行异步操作。

    在Promise未出现前,我们通常是使用嵌套回调函数来解决的。但是使用回调函数来解决异步问题,简单还好说,但是如果问题比较复杂,就会进入回调地狱。

    3.Promise的三种状态?

     等待态(Pending):初始状态

    执行态(Fulfilled):操作成功状态

    拒绝态(Rejected):操作失败状态

    promise状态的变化:单向的从pending变为fulfilledpending变为rejected。但是状态一旦改变就不会再变了。

    4.使用Promise的优缺点?

    优点:让回调函数变成了链式的写法,避免了回调地狱,程序的流程看的更清楚。

    缺点:①无法取消Promise,一旦新建就立即执行,无法中途取消

    ②如果不设置回调函数。Promise内部抛出的错误,不会反应到外部。

    5.Promise的创建

    
    
      var myPromise = new Promise((resolve, reject) => {
                // 进行异步处理
                // 调用resolve或者reject
            })
     

    Promise有俩个参数resolvereject

    resolve的作用是将Promise的状态从等待状态转变成成功状态,并把返回的数据传出来,reject的作用是将Promise的状态从等待状态转变成失败状态,将错误的信息返回。

    Promise是对象,对象和函数的区别就是,对象的状态可以一直保持。

    6.Promise的Api接口

    1. Promise.resolve()

    2. Promise.reject()

    3. Promise.prototype.then()

    4. Promise.prototype.catch()

    5. Promise.all() // 所有的完成

    6. Promise.race()

    Promise.then()

    1.promise.then()

    对于已经实例化的Promise对象可以调用promise.then()方法,传递resolve和reject方法作为回调。

    2.promise.then语法

    promise.then(onFuilled,onRejected)。也可写成promise.then(onFuilled).catch(onRejected).
    3.promise.then回调函数只能执行一次,且返Promise对象。
    4.promise.then有两个参数:分别是promise的成功和失败情况的回调函数。
    5.promise.then语法
    var p=new Promise((resolve,reject)=>{
                resolve('成功');
                // reject(new Error("失败了"))
            });
            p.then(value=>{
                console.log(value);
            }).catch(reason=>{
                console.log(reason);
            })

    注意如果函数抛出的错误返回一个拒绝的Promise,则then将返回一个拒绝的Promise

    Promise.all()

    1.promise.all()方法用于将多个promise实例,包装成一个新的实例

    var p=new Promise([p1,p2,p3]);
    

     promise.all()中的实例不一定是数组,但是必须要有iterator接口(Array,Map,Set,String等) 

    2.promise.all的使用

    当实例的状态变成Fulfilled状态,实例P才会变成Fulfilled'状态,将所有实例的返回值传递给p的回调函数。

    但是当实例中有一个被rejected,p的状态就变成rejected状态,此时第一个被rejected的实例的返回值传递给p的回调函数。

    通俗点就是都成功才会调用成功的回调函数。一旦有一个失败就调用失败的回调函数。
     var p1 = new Promise((resolve, reject) => {
                resolve('成功');
            })
     var p2 = new Promise((resolve, reject) => {
                resolve('success');
            })
     var p3 = Promise.reject('失败');
            
            var p = new Promise.all([p1, p2, p3]);
            var pp = new Promise.all([p1, p2,]);
            p.then(success => {
                console.log("success");
            }).catch(error => {
                console.log(error)//失败
            })
            pp.then(success => {
                console.log("success");//成功 success
            }).catch(error => {
                console.log(error)
            })

    3.Promise.all()的应用场景

    比如在支付的时候要判断支付的余额和商品的库存,当顾客的余额足够并且商品的库存有余是才可以支付成功,有一个情况不符合就无法完成支付。

    Promise.race()

    race:赛跑; 速度竞赛; 竞争; 角逐; 

    也是将多个Promise实例包装成一个新的Promise实例

    var p=new Promise([p1,p2,p3]);

    但是与Promise.all()不同的是,所有实例中只要有一个状态改变,p就跟着改变,率先改变的实例的返回值传递给p的回调函数;

       var p1 = new Promise((resolve, reject) => {
               setTimeout(()=>{
                    resolve('success');
               },3000)
            })
            var p2 = new Promise((resolve, reject) => {
               setTimeout(()=>{
                    reject('失败')
               },1000)
            })
    
            var p=new Promise.race([p1,p2]);
            p.then(success => {
                console.log("success");
            }).catch(error => {
                console.log(error);//reject 失败  p2的状态率先改变
    })

    Promise.resolve ()

    可以将不是Promise的对象转成Promise对象;生成的新的实例,实例状态为fulfilled,就会立即执行.

    若promise.resolve()里面的参数本来就是Promise对象就会原封不动的返回。

    var p=promise.resolve(hello);//p为promise对象

    实例的参数还是回调函数的参数

    var p = promise('hello');
            p.then(res => {
                console.log(res);//hello
            })

    Promise.reject()

    Promise.reject()方法也会返回一个新的Promise实例,实例的状态为rejected

    var p = promise('出错了');
            p.then(res => {
                console.log(res);//出错了
            })
    p2的状态率先改变
  • 相关阅读:
    SQL Server Audit监控触发器状态
    SQL Server 数据变更时间戳(timestamp)在复制中的运用
    SQL Server 更改跟踪(Chang Tracking)监控表数据
    SQL Server 变更数据捕获(CDC)监控表数据
    SQL Server 事件通知(Event notifications)
    SQL Server 堆表行存储大小(Record Size)
    SQL Server DDL触发器运用
    SQL Server 默认跟踪(Default Trace)
    SQL Server 创建数据库邮件
    SQL Server 跨网段(跨机房)FTP复制
  • 原文地址:https://www.cnblogs.com/babilong/p/13369256.html
Copyright © 2011-2022 走看看