首页 > 技术文章 > promise迷你书-读书笔记

madlife 2019-08-03 11:09 原文

Promise三种类型

  Constructor

  使用Promise构造器来实例化一个promise对象

  

1 var promise = new Promise(function(resolve,reject){
2     //异步处理
3     //处理结束,成功调用resolve,失败调用reject
4 })

  Instance Method

  promise实例对象处理成功或者失败的回调函数

  

promise.then(onFulfilled,onRejected)
// resolve(成功)回调函数 onFulfilled
// reject (失败)回调函数 onRejected

promise.catch(onRejected)
//reject(失败)时,对异常的处理 onRejected

  Static Method

  Promise作为全局对象还有静态方法

  

Promise.all()
Promise.resolve()
Promise.reject()

 

使用promise对象

  

function getUrl(url){
    return new Promise((resolve,reject)=>{
        $.ajax({
            url:url,
            method:'get',
            success:function(res){
                resolve(res)
            },
            error:function(err){
                reject(err)
            }
        })
    })
}

var url = 'http://httpbin.org/get'
getUrl(url).then((res)=>{
    //处理resolve(成功)的回调
    console.log(res)
}).catch((err)=>{
    //处理reject(异常)的回调
    console.log(err)
})

 

Promise静态方法

  Promise.resolve

    • new Promise的快捷方式

      静态方法Promise.resolve(value) 可以认为是 new Promise() 方法的快捷方式

    

Promise.resolve(42).then(function(value){
    console.log(value);
});

      Promise.resolve(value) 同样返回一个promise对象,并且会使这个对象从pending状态转为resolved状态

    • Thenable

      Promise.resolve静态方法的另一个作用就是将thenable对象转为promise对象,到底什么样的对象能算是thenable的呢,最简单的例子就是 jQuery.ajax(),它的返回值就是thenable的.因为jQuery.ajax() 的返回值是 jqXHR Object 对象,这个对象具有 .then 方法

   

function getUrl(url){
    return Promise.resolve($.ajax(url))
}
var url = 'http://httpbin.org/get1'
getUrl(url).then((res)=>{
    console.log(res)
}).catch((err)=>{
    console.log(err)
})

  Promise.reject

    和Promise.resolve()一样是静态方法,是new Promise()的快捷方式

    

Promise.reject(new Error("BOOM!")).catch(function(error){
    console.error(error);
});

  

每次调用then都会返回一个新创建的promise对象

  then的错误使用方法  

function badAsyncCall() {
    var promise = Promise.resolve();
    promise.then(function() {
        // 任意处理
        return newVar;
    });
    return promise;
}

  首先在 promise.then 中产生的异常不会被外部捕获,此外,也不能得到 then 的返回值,即使其有返回值。

  由于每次 promise.then 调用都会返回一个新创建的promise对象,应该采用promise chain的方式将调用进行链式化,修改后如下

  

function anAsyncCall() {
    var promise = Promise.resolve();
    return promise.then(function() {
        // 任意处理
        return newVar;
    });
}

 

  

推荐阅读