犀牛书笔记(第13章 异步)
ES6新增的promise是一种对象,代表某个异步操作尚不可用的结果。关键字async和await允许开发者将基于promise的异步代码写成同步的形式。异步迭代器和for/await循环允许在看起来同步的简单循环中操作异步事件流。
回调
异步的来源:定时器、时间、网络请求、Node环境。
promise
promise是为了简化异步编程而引入的核心语言特性。它是一个对象,代表异步操作的结果。promise的API: 没有办法同步取得promise的值,只能要求它在值就绪的时候调用一个回调。使用promise的好处:1. 基于回调的异步编程经常出现嵌套多层的情况,造成代码缩进过多以致难以阅读。而promise可以让这种嵌套以线性的链条形式表达,简化了阅读。2. 标准化的异步错误处理。
promise做不了的:不能用它表示重复的异步计算。比如可以用promise代替setTimeout,但代替不了setInterval, 因为后者会重复调用回调函数;类似的,可以用promise代替XMLHttpRequest的load事件处理程序,但不能代替按钮的click事件处理程序,因为click会多次点击。
promise表示该对象被创建之后发生的异步计算的未来结果。因为计算是在返回promise对象之后执行的,所以没办法让该计算像以往(同步情况下)那样返回一个值,或者抛出一个可以捕获的异常。补救措施是,1. 把计算结果传给then的第一个参数函数的参数;2. 把异常传给then的第二个参数函数的参数。不过更符合传统的写法是,getJSON(url).then(displayUserProfile).catch(handleProfileError); 这行代码意味着,displayUserProfile中如果发生了异常,也会传给handleProfileError.
一些术语的理解:

promise chain:
promise的最重要的优点是,以线性then方法调用链的形式表达一连串异步操作,而无需把每个操作嵌套在前一个操作的回调内部。也就是上面说的,简化阅读。


resolve promise:
async和await
异步迭代