众所周知:async+ await 就是 generator+自动执行器的语法糖
想要了解async/await就要先了解generator和thunk
//方法1
function* foo(x) {
yield x + 1;
yield x + 2;
return x + 3;
}
//方法2
function *foo(x) {
yield x + 1;
yield x + 2;
return x + 3;
}
generator函数的特点
相比于普通函数,除了 return,还可以使用yield 返回多次
运行generator函数
//方法一:使用generator函数的next函数
const fn = foo(5) //创建了一个generator函数
fn.next() //{value:6,done:false},调用next,直至遇见return,返回的yield语句后的值
...
fn.next() //{value: undefined, done:true}//
//方法2 使用for/of
for(let i of foo(5)){
// console.log(i) //for of 遍历
}
插播for/of 和 for/in的区别
function* foo(x) {
let y = yield x + 1;
yield y+ 3;
return x + y;
}
//正常
const fn = foo(2)
fn.next() // 3
fn.next(2) // 5
fn.next() // 4
//异常
const fn = foo(2)
fn.next() // 3
fn.next() // y:undefined NaN
fn.next() // y:undefined NaN
function* g1(){
yield 1
yield 2
return \'g1\'
}
function* g2(){
yield 3
yield 4
return \'g2\'
}
function g(){
yield* g1()
let str = yield* g2()
console.log(str)
}
const gen = g()
gen.next() //{value:1,done:false}
gen.next() //{value:2,done:false}
gen.next() //{value:3,done:false}
gen.next() //{value:4,done:false}
gen.next() //{value:undefined,done:true}
**
为什么没有获取到g1和g2函数中return的值呢?
yield* 的作用是将函数本身的yield表达式代理出去。故在执行的时候只代理了yield表达式,没代理return语句。
yield* 返回的结果就是代理的函数return的结果。
**
如 readFile(‘/file.txt\',callback)//多参数函数
//thunk版本的
function myThunk(filename){
return function (callback){
func.readFile(\'/file.txt\',callback)
}
}
const newFunc = myThunk(\'./file.txt\')
newFunc(callback)
//thunk转化器
function myThunk(fn){
return function (){
let args = Array.prototype.slice.call(arguments)
return function(callback){
args.push(callback)
return fn.apply(this,args)
}
}
}
//转化readFile
var newRead = myThunk(readFile)
newRead(\'/file.txt\')(callback)
//普通流程管理
cont readFile = thunkify(fs.readFile) //转化为thunk函数
function* gen(){
let r1 = yield readFile(\'/file1.txt\')
console.log(r1)
let r2 = yield readFile(\'/file2.txt\')
console.log(r2)
}
const fn = gen()
const result = fn.next()
result.value((err,data)=>{
if(error) throw err
const res = fn.next(data)
res.value((err,data)=>{
if(error) throw err
const res = fn.next(data)
})
})
//更强大的自动流程管理
const fn = (func)=>{
var a = func()
const next = (err,data)=>{
if(err) throw err
const r1 = a.next(data)
if(r1.done){
return r1.value
}
r1.value(next)
}
next()
}
自动流程管理和async/await的流程管理逻辑基本一致,主要async/await主要针对于promise
//异步函数
function getNumber(d){
return new Promise((resolve,reject)=>{
setTimeout(()=>{
console.log(d)
resolve(d)
},10000)
})
}
function asyncFn(func){
const g = func()
const next = (data)=>{
const result = g.next(data);
if(result.done){
return result.value
}
else{
result.value.then((sd,fd){
next(sd)
})
}
}
next()
}
const func = function * (){
const f1 = yield getNumber(1)
const f2 = yield getNumber(f1)
}
asyncFn(func);
thunk 函数
async/await 简单实现