Promise 在回调函数的基础上,反转了控制,优化了异步的写法
某个对象具有一个 Symbol.iterator 方法被称为可迭代对象,
var obj = {[Symbol.iterator] : function () {}}
调用 Symbol.iterator 方法返回一个迭代器生成函数,执行生成函数返回迭代器
obj[Symbol.iterator]()
迭代器是一个对象,根据迭代器协议,迭代器一定具有 next 方法,返回{value,done},非必须具有return,throw 方法
{next: function () {}}
除了for...of循环以外,扩展运算符(...)、解构赋值和Array.from方法内部调用的,都是遍历器接口。可以直接遍历迭代器,
for (let value of obj[Symbol.iterator]())
也可以遍历可迭代对象
for (let value of obj)
迭代器可以自己实现
也可以使用生成器函数生成
Symbol.iterator 其实也是迭代器生成方法
生成器函数,返回一个generator,配合 yield 关键字,可以自定义 迭代规则
generator 就是一个迭代器
生成器 yield 的是异步操作
function fetch() {return new Promise(function (resolve, reject) {setTimeout(() => {resolve({"json": "success"})}, 1000);})}function* gen(){var url = 'http://dict.qq.com/dict?q=dd';var result = yield fetch(url);console.log(result);}var g = gen()var result = g.next()result.value.then(function (data) {return data;}).then(function (data) {g.next(data);})
虽然 Generator 函数将异步操作表示得很简洁,但是流程管理却不方便
thunk函数实际上有些类似于JavaScript函数柯里化,
function curry (fn) {const args1 = Array.prototype.slice.call(arguments, 1)return function () {const args2 = Array.from(arguments)const arr = args1.concat(args2)return fn.apply(this, arr)}}// 需要柯里化的sum函数const sum = (a, b) => {return a + b}curry(sum, 1)(2) // 3
async 函数自带执行器
co 函数,yeild 命令后面只能是 thunk 和 promise,
async 函数的 await 后面可以是 promise 和原始类型值,
