JS_是时候使用promise了

1. 异步编程

JS是单线程执行了,通过event loop实现了非阻塞的I/O。编程中经常用异步回调函数的方式处理I/O的反馈结果(网络请求,用户交互事件)。如分别发送两个请求:

function xhrRequest(url, callback) {
    setTimeout(function(){ // 用setTimeout模拟异步请求
        callback();
    }, 0)
}

xhrRequest('/index', function(){
    console.log('request /index done');
})
xhrRequest('/list', function(){
    console.log('request /list done');
})

但如果想在请求index后再请求list怎么办呢?,可能会这样写:

xhrRequest('/index', function(){
    console.log('request /index done');
    xhrRequest('/list', function(){ // 回调函数里,再次回调
        console.log('request /list done');
    })
})

但是如果有3个或4个异步请求有先后依赖怎么呢?回调函数会一直嵌套回调函数(callback hell),代码看起来乱糟糟的,并且不好维护。事件模式也不能很好处理这些,急需其他能降低异步编程复杂性的方式。

2. promise模式

2.1 promise A+

Promise已经是个标准了,最新的是Promise A+标准。标准中给Promise的定义是:"A promise represents the eventual result of an asynchronous operation"。即Promise表示一个异步操作的最终结果。主要通过Promise对象的then方法和Promise对象进行交互:注册失败,成功回调函数,并且失败回调函数接收一个失败原因(reason)参数,成功回调函数接收一个值(value)参数。Promise A+标准主要是定义then方法的规范。

2.1.1 Promise对象状态

Promise对象有三种状态:Pending(待定),Fullfilled(已完成),Rejected(已拒绝)。
A:Pending的Promise对象可以转成Fullfilled或者Rejected
B:Fullfilled的Promise对象不能转成其他状态,并且必须含有一个值(value),该值不能变。
C:Rejected的Promise对象不能转成其他状态,并且必须含有一个原因对象(reason)表示失败的原因,该值不能变。

2.1.2 then(onFullfilled, onRejected)方法

then方法的规范很多,认真读读标准。但要主要下面几点:
A:每个回调函数只能执行一次。
B:多次调用then方法,可以注册多个回调函数,回调函数的调用顺序取决于调用then方法的顺序。如果Promise对象已经处于fullfilled/ rejected状态,调用then方法会立即执行onfullfilled/onRejected回调函数。
C:then方法必须返回个Promise对象: Promise2 = Promse1.then(onFullfilled, onRejected)。但没规定Promise1和Promise2是否相等,这个要看具体的实现了。

2.1.3 then链

then方法返回一个Promise对象,这样就构成一个then链。前面的Promise对象的状态变化对后面的Promise对象的状态的影响称为Promise解决程序(The Promise Resolution Procedure)。

2.2 Promise标准实现

实现Promise标准的库和框架有很多了,jQuery,Zeptojs,ES6等。好多库中Promise实现叫Deferred,Deferred对象是用来操作Promise对象(修改Promise对象状态),而Promise对象本身只提供then方法添加回调函数(以及其他添加回调函数的方法),不提供操作Promise对象的方法,这样设计使得Promise对象对外不可修改,详细参考ZeptoJS Deferred实现。

2.3 为什么Promise模式重要

Promise是把类似的异步处理对象和处理规则进行规范化, 并按照采用统一的接口来编写,而采取规定方法之外的写法都会出错。这样更有利理解,维护。将复杂的异步处理轻松地进行模式化。

参考

  1. 异步编程
  2. Promise A+标准
  3. promises 很酷,但很多人并没有理解就在用了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值