js callback->Promise->async/await

之前在知乎上听了个live,当时在发布,没认真听、也没怎么听清,今天又重新听了一遍,理了一下中间的技术以及一些知识点。

异步

异步的发展趋势 callback -> Promise -> async/await

callback

callback很好理解,回调函数,一般作为参数传递,执行完异步请求之后,执行。比较常见的是jQuery中的deferred,就是封装的比较好的callback的代表(个人理解,如果有不同意见可以提)。

专门去查了一下jQuery的deferred,开头有这么一段话,可以证明是封装了的callback。

The Deferred object, introduced in jQuery 1.5, is a chainable utility object created by calling the jQuery.Deferred()
method. It can register multiple callbacks into callback queues, invoke callback queues, and relay the success or failure state of any synchronous or asynchronous function.

Promise

Promise自从被纳入了Es6之后,开始使用的越来越多,但是它不支持低版本浏览器,可以使用 polyfill 来使其支持ie8以上版本。

主要知识点有以下几点:
1、 一个promise可能有三种状态:等待(pending)、已完成(fulfilled)、已拒绝(rejected)
2、 一个promise的状态只可能从“等待”转到“完成”态或者“拒绝”态,不能逆向转换,同时“完成”态和“拒绝”态不能相互转换
3、 promise必须实现then方法(可以说,then就是promise的核心),而且then必须返回一个promise,同一个promise的then可以调用多次,并且回调的执行顺序跟它们被定义时的顺序一致
4、 then方法接受两个参数,第一个参数是成功时的回调,在promise由“等待”态转换到“完成”态时调用,另一个是失败时的回调,在promise由“等待”态转换到“拒绝”态时调用。同时,then可以接受另一个promise传入,也接受一个“类then”的对象或方法,即thenable对象。

使用Promise的优势

1、多个异步调用,同步/并行

Promise.all([a(), b(), 10]).then(functionC);   //这是 primise 的异步写法

2、竞争

如果说Promise.all是promise对象之间的“与”关系,那么Promise.race就是promise对象之间的“或”关系。
比如,我要实现“点击按钮或者5秒钟之后执行”:

var btn = document.getElementsByTagName('button');
Promise.race(wait(5000), waitFor(btn, click)).then(function(){ console.log('run!')})

3、异常处理

异常处理一直是回调的难题,而promise提供了非常方便的catch方法:在一次promise调用中,任何的环节发生reject,都可以在最终的catch中捕获到:

Promise.resolve()
  .then(function(){
    return loadImage(img1);
  })
  .then(function(){
    return loadImage(img2);
  })
  .then(function(){
    return loadImage(img3);
  })
  .catch(function(err){
    //错误处理
  })

4、复杂流程

promise有一种非常重要的特性:then的参数,理论上应该是一个promise函数,而如果你传递的是普通函数,那么默认会把它当做已经resolve了的promise函数。这种特性适合与currying函数结合。

async/await

这边我参考的是这篇 async 函数的含义和用法

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文首发在个人博客:http://muyunyun.cn/posts/7b9fdc87/ 提到 Node.js, ...
    牧云云阅读 1,710评论 0 3
  • Promiese 简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果,语法上说,Pr...
    雨飞飞雨阅读 3,401评论 0 19
  • Promise的含义:   Promise是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和...
    呼呼哥阅读 2,215评论 0 16
  • 一.为什么需要promise? 开发网站的过程中,我们经常遇到某些耗时很长的javascript操作。其中,既有异...
    overflow_hidden阅读 12,479评论 2 21
  • 古人云:“天行健,君子以自强不息”以往空空的以为所谓生活强者,乃指精神境界、精神修养! 如此一来便糊涂地陷入一个误...
    王不举阅读 283评论 0 0