promise
What is Promise
Promise是JavaScript的异步操作的解决方案,为异步操作提供统一接口。
它起到代理作用(proxy), 充当异步操作与回调函数之间的中介。Promise可以让异步操作写起来,就像在写同步操作的流程,而不必一层层地嵌套回调函数。
Promise是一个对象,也是一个构造函数。
1 | function f1(resolve, reject) { |
传统方法与Promise方法对比:
1 | step1(function(v1){ |
States of Promise
共三种状态:
- pending
- fulfilled
- rejected
fulfille为resolved.
这三种状态的变化途径只有两种:
从”未完成”到”成功”
从”未完成”到”失败”
1 | function timeout(ms) { |
then 用法解析
1 | // 写法一 |
Promise优缺点
优点:
- 统一异步API,fetch API基于promise的:
1 | fetch(url) |
Promise与事件对比:
- 更适合处理一次性的结果,不能使用Promise
Promise与回调函数相比:
- 更干净的函数参数,回调函数的场景,主函数既有输入参数,又有输出参数。
缺点:
- 多次触发的事件
- 数据流
- 不能取消执行
- 无法获取当前执行的进度信息(比如,要在用户界面展示进度条)(Q Promise)
简单地实现Promise,并支持异步链式调用
1 | function Promise(fn) { |
分开来看,fn是用户传的函数,这个函数内部调用了resolve函数后,就会把promise实例上的cbs全部执行一遍,那么cbs数组中的函数从哪来呢?
1 | Promise.prototype.then = function(onResolved) { |
异步操作封装成Promise,实现对Ajax的封装
1 | function pajax({url=null, method='GET', dataType:'JSON', async='true'}) { |
Promise then的第二个参数和catch的区别
主要区别就是,如果在then的第一个函数里抛出了异常,后面的catch能捕获到,而then的第二个函数捕获不到。
Promise的catch是个语法糖,还是通过then来处理的,类似于:
1 | Promise.prototype.catch = function(fn) { |
捕获错误信息的时候会就近原则。