我们工作中避免不了运用各种方案来解决异步问题,它也是我们在js中遇到的最难搞的;下面为你提供几种方案,希望能为你解惑。
一、回调函数
一、回调函数概念
回调就是指一个函数A被作为参数传递到另一个函数B里,在那个函数B执行完后再执行该函数A。回调函数是异步编程最基本的方法,其优点是简单、容易理解和部署;缺点是不利于代码的阅读和维护,可能会造成回调地狱。
二、回调与异步区别
回调并不一定就是异步,两者并无直接联系。回调可以把同步操作变成了异步操作,避免堵塞程序运行,相当于先执行程序的主要逻辑,将耗时的操作推迟执行。
异步的话,简单来说就是非常耗时的操作而已,比如:ajax请求远程数据,读取文件内容readFile,IO等
二、Promise
一、promise概念
promise指答应,承诺的意思,结果并不会立即得到。Promise是异步编程的一种解决方案,能更优雅的解决异步或者耗时操作。它主要针对的是链式调用,回调地狱,并发问题...
没有异步操作时也就不需要Promise;Promise本身不是异步的,只有.then的调用才是异步操作。
二、Promise的特点
1,then方法通常是表示异步操作成功时的回调,catch方法通常是表示异步操作失败时的回调;
2,在调用时then在前面,catch在后面;
3,then方法可以调用多次,前一个then的返回值将作为后一个then的参数;
4,一般then方法存在两个参数:data和err,但一般会将err省略;靠catch方法来捕捉错误
三、Promise的三种状态
Promise存在三种状态。在异步操作中,操作发出,默认处于等待态(pending);当操作结束完成之后,就会有相应的结果,结果仅有两种:拒绝态(rejected),成功态(fulfilled)
为了更清晰,直接上代码:四、promise链式调用
为何会出现promise的链式调用?是如何一步步引出来的它呢?现在让我来为你一点点解开疑惑吧!
例子:异步读取文件
五、promise的递归解析
promise的then方法返回新的promise1,其内容是由回调方法的返回值决定的;回调中可以返回promise2,使外面的promise1的内容成为promise2的内容。也就是说如果要用promise来递归,只需要在then回调中返回递归promise即可
六、promise常见方法
1,catch方法
常见特点:
1)如果then方法中有err函数,在这个then方法后面又有catch方法;如果转成了失败态,它会走then方法的err函数。
4)在promise中,一般在then中只有data函数,在then后面有catch方法;所以使用then来获取data数据,在catch中获取err错误
2,静态方法
在Pomise类上面,提供了几个静态方法resolve、reject它们都可直接使用.运算符调用,直接说不够直观,就看代码吧!
1)resolve方法
三、Generator+Co
一、迭代器概念
迭代器就是为实现对不同集合进行统一遍历操作的一种机制,它本质是个对象。对象中一定存在一个next函数,函数返回值又是个对象,对象中存在两个属性:value和done。以下是依照概念封装的,创建迭代器的函数:
二、生成器概念
生成器Generator属于ES6中的语法,用来解决异步操作。形式上,Generator函数是一个普通函数,但是有两个特征:一是,function关键字与函数名之间有一个星号;二是,函数体内部使用yield表达式,定义不同的内部状态(yield在英语里的意思就是“产出”)。
还有一种特殊情况,生产器存在于对象中时,星号存在的位置有所不同三、迭代器与生成器的关系
调用生成器就会生成迭代器,生成器可直接产生好多值,而迭代器只能next一下,拿到一个值;因此生成器才会具有中断程序的作用,不会将{}的代码一下子执行完毕。
四、生成器传参
在生成器中如果出现let声明的变量或者是console.log()时都需要传递参数。参数的传递是下面调用生成器来next时传递参数,且第一个的next传递参数无处接收,仅有第二个next传递参数时,才会给第一个声明的变量值。
五、生成器读文件
生成器读取文件需要配合Promise使用,文件的读取产生promise,可以直接.then处理,这样照样会产生Promise嵌套问题。
六、Co库的出现
因为利用Generator来读取文件,配合promise来解决异步操作问题。在读取多个文件时照样会产生promise的多层嵌套问题,为解决该问题,出现Co库,来更好地解决异步。
四、async+await
async和await可以当做是generator与co库的语法糖,是现在异步解决方案中最完美的一种。