Promise详解(一) ----基础用法

什么是Promise

Promise是由社区最早提出并实现的,后加入到es6规范中。为更好处理javascript异步问题,用于解决其多次异步回掉嵌套问题。下面先尝试下promise的基础用法吧。

创建promise实例

    var promise = new Promise(function(resolve,reject){
        if(flag){
            resolve("成功了");
        }else{
            reject("失败了")
        }
    })
复制代码

解析上述代码:

  1. Promise是一个构造函数,它接收一个function(用excurator代替)作为参数
  2. 其内部规定其含有3种状态:
    pedding(等待态): 在创建实例后,到未调用resolve和reject前都属于pedding态。
    success(完成态--成功): 调用resolve(data)后处于成功态
    error(完成态--失败):  调用reject(data)后处于失败态   
  1. promise成完成态后,其状态不会再发生变化
  2. excurator可接收2个形参(resolve,reject),其都可接收1个形参,后期会传入到then方法中。 resolve(data)后promise为success态。reject(data)后promise变为error态

promise.then方法

    promise.then(function(data){
        console.log(data)    //==>成功了  data指的是resolve传过来的值
        return 100;
    },function(e){
        console.log(e)  //==>失败了  e指的是reject传过来的值
    }).then(function(data){    // ==> 链式调用
        console.log(data)    // 100
    },function(e){
    })
复制代码

解析上述代码:

  1. promise.then(fun1,fun2)在调用时,若promise的状态变为success时会调用fun1其接收resolve传入的data,状态变为error会调用fun2接收reject传入的失败原因
  2. promise的链式调用实现:then方法在调用后通过内部机制返回一个新的promise来实现。
  3. then链式调用时,第一种:上一个then的fun中有报错,会进入当前then的错误中。第二种:上一个then的fun中有返回值,则直接进入当前then的正确逻辑中。第三种:若上一个then未有正确或错误处理,则其接收值将会穿透,进入当前then中处理

promise.catch(function(e){...})

等同于promise.then(null,function(e){...}),若前面then中没有错误处理,则统一进入此方法

 let promise = new Promise(function(resolve,reject){...})
    promise.catch(function(data){
        
    })
复制代码

promise.finally(function(){})

不管 Promise 对象最后状态如何,都会执行的操作

    let promise = new Promise(function(resolve,reject){...})
    promise.then(...).finally(function(){
        
    })
复制代码

let p = Promise.all([p1,p2...])

p1,p2指promise实例,在p1,p2...所有状态都为成功时,p的状态才为成功,任何一个失败,即为失败

Promise.all([p1,p2,p3]]).then(function (lists) {
  // ...  lists是一个数组,其结果和[p1,p2,p3]的返回值一一对应
}).catch(function(reason){
  // ...
});
复制代码

let p = Promise.race([p1,p2...])

p1,p2指promise实例,其任何一个状态改变即会进入p的then方法中去

Promise.race([p1,p2,p3]]).then(function (data) {
  // ...  data为先返回结果的promise的返回值
}).catch(function(reason){
  // ...
});
复制代码

let p = Promise.resolve(param) // Promise.reject(param)

两个方法类似,分别会进入后期的then中的正确/异常处理逻辑中去。其参数param会在内部判断,然后进入不同处理。以resolve方法为例如下

  1. param为promise实例。则直接进入promise的调的resolve方法
  2. param为thenable 对象,直接原封返回thenable对象的resolve对象
  3. 其它值,则直接将对象作为成功原因,返回
//param为promise实例
Promise.resolve(new Promise(function(resolve,reject){
    resolve("params的promise成功了")
})).then(function(data){
    console.log(data)  // params的promise成功了
})

//param为thenable对象
Promise.resolve({
  then: function(resolve, reject) {
    resolve('成功了');
  }
}).then(function(value) {
  console.log(value);  // 成功了
});

//param为其它对象
Promise.resolve(100).then(fucntion(data){
    console.log(data)   // 100
})
复制代码

转载于:https://juejin.im/post/5aa64634f265da23a334dee8

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值