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 和原始类型值,