Promise对象

Promise对象

基本用法与理解

首先明确Promise是一个对象,我们需要使用这个对象来进行异步操作,就是说利用promise使某些操作不立即执行而是异步执行。
既然是对象,我们要使用就要创建一个对象实例,这个对象接受一个参数,参数类型是个函数,这个函数接受两个参数,resove和reject,这两个也是函数。
我学习js中的异步方式开始一直有一个困惑,不管是回调函数还是Promise对象,是不是回调函数或者promise中的代码会异步执行?我只是把想要异步执行的代码写在somecode下或者是call中就可以了?像下面这样:

//回调函数格式
function foo(callback) {
     //你自己的代码;
     asyncFn(function() {
          var result = 你自己的代码;
          callback(result);
     });
}

我们需要搞清楚的是回调函数或者是promise只是帮助我们实现异步调用的一个工具,想要我们写的代码异步执行,我们需要使用类似setTimeOut的函数来包裹代码,才能异步执行函数,而promise是用来传递异步操作的消息的。

var promise = new Promise(function(resove,reject){
    //some code

    if(/*operation success*/){
        resolve(value);
    }
    else{
        reject(error);
    }
});

关键就在于promise的状态属性,promise一共有3个状态,pending,resolved和rejected,初始的promise对象是pending状态,就是进行中的意思,当我们执行操作成功时,可以调用resolve函数将对象状态改成resolve(已解决)的状态,同时返回成果的结果;如果失败了,就改成rejected(操作失败)的状态,同时返回失败的错误描述。(XMLHttpRequest用法见XMLHttpRequest 对象

var getJSON =function(url){
    var promise = new Promise(function(resolve,reject){
        var client = new XMLHttpRequest();
        client.open('GET',url);
        client.onreadystatechange = handler;//每次 readyState 属性改变的时候调用的事件句柄函数。当 readyState 为 3 时,它也可能调用多次
        client.responseType = 'json';
        client.setRequestHeader('Accept','application/json');
        client.send();
        function handler(){
            if(this.readyState != 4){
                return;
            }
            if(this.status == 200){
                resolve(this.response);
            }
            else{
                reject(new error(this.statusText));
            }
        }
    });
    return promise;
}
getJSON('./posts.json').then(
    function(json){
        console.log(json);
    },
    function(error){
        console.log(error);
    });

上面是一个最原始的ajax请求的实例,简单分析一下,就是我们声明了一个函数getJSON(),它返回一个promise对象,这个对象包含的信息就是resolve或者是reject返回的信息,如何去抓取promise返回的信息,这里就需要用到promise对象的then()方法,then()接受两个函数参数,第一个函数处理resolve的返回结果,第二个参数处理reject的返回结果(可不写)。

then()

then()方法可以采用链式写法来处理前一个then()返回的promise对象

getJSON('./posts.json').then(
    function(post){
        return getJSON(post.commentURL)
    }
).then(
    function(comment){
        console.log(comment)
    }
)

catch()

如果then()方法中的操作发生了错误,我们就需要用到promise的另外一个方法catch用来捕获:

getJSON('./posts.json').then(
    function(post){
        return getJSON(post.commentURL)
    }
).catch(
    // 处理 getJSON 和 前一个回调函数运行时发生的错误
  console.log('发生错误!', error);
)

其实就相当于promise的异步操作失败会触发promise状态变为reject,这个时候reject就会返回错误信息,也就是抛出错误,这时catch就会捕获错误并反馈出来。

其他方法

Promise对象还有很多其他方法:

Promise.all()                    //合并多个Promise对象
Promise.race()                   //合并多个Promise对象
Promise.resolve()                //将一个对象转化成Promise对象,状态为resolved
Promise.reject()                 //将一个对象转化成Promise对象,状态为rejected
Promise.prototype.done()         //避免catch发生错误无法抛出的情况,写在链式调用的最后
Promise.prototype.finally()      //`finally`方法用于指定不管Promise对象最后状态如何,都会执行的操做  

写这一篇的目的还是理解一下ES6中promise的主要用法,至于上面这些方法,《ES6标准》里面都有详细地使用方法和注意点,但在工作中用到的情况不多,想知道自己去查。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值