Promise
Iterator 和 for … of 循环
Generator
async | async
14.Promise 对象
Promise
pending => resolved
pending => rejected
在Promise定义时,函数已经执行了;Promise构造函数只接受一个参数,即带有异步逻辑的函数。这个函数在 new Promise 时已经执行了。只不过在没有调用 then 之前不会 resolve 或 reject。
在then方法中通常传递两个参数,一个 resolve 函数,一个 reject 函数。reject就是出错的时候运行的函数。resolve 函数必须返回一个值才能把链式调用进行下去。
resolve 返回一个新 Promise : 返回一个新Promise之后再调用的then就是新Promise中的逻辑了。
resolve 返回一个值 : 返回一个值会传递到下一个then的resolve方法参数中。
Promise 的缺点:
- 一旦新建它就会立即执行,无法中途取消 => pending 状态 不可逆
- 需要用 catch 去主动抓取报错
Promise 新建后就会立即执行
1 | let promise = new Promise(function(resolve, reject) { |
15. Iterator 和 for … of 循环
16. Generator 函数的语法
Generator
function关键字与函数名之间有一个 *;
函数体内部使用yield语句,定义不同的内部状态;
第一次输出fn.next()返回一个简单的对象{value: “a”, done: false},’a’就是f函数执行到第一个yield语句之后得到的值,false表示f函数还没有执行完,只是在这暂停。
第二次,返回的就是{value: “b”, done: false},说明f函数运行到了第二个yield语句,返回的是该yield语句的返回值’b’。返回之后依然是暂停。
第三次,第四次同理,这样整个f函数就运行完毕了。
17. Generator 函数的异步应用
异步操作的同步化写法
Generator函数的暂停执行的效果,意味着可以把异步操作写在yield语句里面,等到调用next方法时再往后执行。这实际上等同于不需要写回调函数了,因为异步操作的后续操作可以放在yield语句下面,反正要等到调用next方法时再执行。所以,Generator函数的一个重要实际意义就是用来处理异步操作,改写回调函数。
强调:只有当yield后面跟的函数先执行完,无论执行体里面有多少异步回调,都要等所有回调先执行完,才会执行等号赋值,以及再后面的操作。这也是yield最大的特性。