一、generator(生成器)是ES6标准引入的新数据类型,他和promise一样都是异步事件的解决方案
//generator函数生成斐波那契
// generator(生成器)是ES6标准引入的新数据类型,async就是 Generator 函数的语法糖
//本质:用来处理异步事件的对象/包含异步操作的容器
function* fib(num){
console.log(this); //window,赋值给f之后,执行相当于window.f.next()
let n=0
let a=0
let b=1
while(n<num){
// yield后面一定要加分号,不然会接收后面的一切
yield a;
// 解构赋值交换变量,无需中间值
[a,b]=[b,a+b]
n++
}
return
}
console.log(Object.prototype.toString.call(fib));
//[object GeneratorFunction],但是js无法直接读取Generator构造函数
let f=fib(5)
console.log(f); //结果看图示
console.log(f.next());
console.log(f)的结果,是一个Generator实例
二、Promise
本质:用来处理异步事件的对象/包含异步操作的容器
作用:promise可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。
缺点:
1.无法取消promise,一旦新建就会立即执行,无法中途取消。
2.而且如果不设置回调函数,promise抛出的错不会反应到外部
3.当处于Pending状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)。
4.Promise 真正执行回调的时候,定义 Promise 那部分实际上已经走完了,所以 Promise 的报错堆栈上下文不太友好。
三、async为什么比promise更好
简单概况promise和async的优缺点就是:使用async函数可以让代码简洁很多,不需要像Promise一样需要些then,
不需要写匿名函数处理Promise的resolve值,也不需要定义多余的data变量,还避免了嵌套代码。错误处理:Async/Await
让 try/catch 可以同时处理同步和异步错误。
四、async为什么比generator更好
async为什么比generator更好
1.内置执行器。
2.更好的语义
3.返回值是 Promise
4.更广的适用性
五、异步请求的解决方式有以下六种方式
异步请求的解决方式有以下六种方式
①回调函数:实现简单、易于理解。但不利于后面的维护等,不可用 try-catch 去捕获错误,也不可以直接 return 出来。
②事件监听:易于理解,可同时指定多个回调函数,利于模块化。但是很难看出主流程是到底是哪一个。
事件,promise,generator,async和await。
③发布订阅:与事件监听类似,但是相对比事件监听好些。因为可以通过“发布者”,有多少订阅者,从而监控程序的运行。
④Promise:一般用于网络请求、读取本地文件等较长时间的操作,可通过then/catch/finally等链式调用,解决回调地狱问题。但是也有以上说的四点缺点。
⑤Generators/ yield:语法行为与传统函数完全不同,强在可以控制函数的执行。比较抽象难懂。
⑥async/await:async返回的一般是 promise实例对象,await后面跟的可以是表达式/请求。且通俗易懂。