异步处理方法

591 阅读5分钟

我们工作中避免不了运用各种方案来解决异步问题,它也是我们在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会出现与回调同样的回调地狱,随即就引出promise链式调用

五、promise的递归解析

  promise的then方法返回新的promise1,其内容是由回调方法的返回值决定的;回调中可以返回promise2,使外面的promise1的内容成为promise2的内容。也就是说如果要用promise来递归,只需要在then回调中返回递归promise即可

六、promise常见方法

1,catch方法

 常见特点:
  1)如果then方法中有err函数,在这个then方法后面又有catch方法;如果转成了失败态,它会走then方法的err函数。

  2)如果then方法中没有err函数,在这个then方法后面又有catch方法;如果转成了失败态,它会走catch方法。
  3)对于在then方法中的err函数返回错误err的话,这个错误err会return到下一个then的data函数中。
  4)在promise中,一般在then中只有data函数,在then后面有catch方法;所以使用then来获取data数据,在catch中获取err错误

2,静态方法

  在Pomise类上面,提供了几个静态方法resolve、reject它们都可直接使用.运算符调用,直接说不够直观,就看代码吧!
 1)resolve方法

 2)reject方法
 3)finally方法
 4)all方法
 5)race方法

三、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库的语法糖,是现在异步解决方案中最完美的一种。