异步编程


 迭代器与生成器
  1 迭代器(Iterator)
   迭代器是一种接口,也可以说是一种规范。它提供了一种统一的遍历数据的方法。
    const obj = {
[Symbol.iterator]:function(){}
}
    [Symbol.ite rato r]属性名是固定的写法,只要是拥有该属性的对象,就能够用迭代器的方式 进行遍历。
  2 生成器(Generator)(扩展)
   生成器也是ES6新增加的一种特性。它的写法和函数非常相似,只是在声明时多了一个*号。
   它可以通过 yield关键字将函数的执行挂起,或者理解成暂停。它的外部在通过调用n ext方法,让函数继续执 行,直到遇到下一个yield,或函数执行完毕。
  async和await
  在ES7中,加入了 async函数来处理异步。它实际上只是生成器的一种语法糖而已,简化了外部 执行器的代码,同时利用await替代yield, async替代生成器的*号。
  在函数中,第一句用了 await。它替代了之前的yield。后面同样需要跟上一个Promise对象。接下 来的打印语句会在上面的异步操作完成后执行。外部调用时就和正常的函数调用一样,但它的实 现原理和生成器是类似的。因为有了 async关键字,所以它的外部一定会有相应的执行器来执行 它,并在异步操作完成后执行回调函数。只不过这一切都被隐藏起来了,由JS引擎帮助我们完 成。我们需要做的就是加上关键字,在函数中使用await来执行异步操作。这样,可以大大的简 化异步操作。同时,能够像同步方法一样去处理它们。
  那如果await后面跟的不是Promise对象又会发生什么呢?
   这样的代码是允许的,不过await会自动将hello字符串包装一个Promise对象。
  创建了 Promise对象后,立即执行resolve,并将字符串hello传递给外部的执行器。外部执行器的 回调函数再将这个hello传递回来,并赋值给data变量。所以,执行该代码后,马上就会输出字符 串hello。虽然代码能够这样写,但是await在这里的意义并不大,所以await还是应该用来处理异 步方法,同时该异步方法应该使用Promise对象。
   async函数里面除了有await关键字外,感觉和其他函数没什么区别,那它能有返回值吗?
   在delay函数中先执行等待2秒的异步操作,然后返回字符串finish。外部调用时我用一个变量接收 它的返回值
  我们可以看到,没有任何等待立即输出了一个Promise对象。而整个程序是在2秒钟后才结束的。 由此看出,获取async函数的返回结果实际上是return出来的一个Promise对象。假如return后面 跟着的本来就是一个Promise对象,那么它会直接返回。但如果不是,则会像await—样包裹一个 Promise对象返回
   执行的结果
 Promise实现异步
  1回调函数
   回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
   回调地狱
    在异步操作中加入同步的 行为,如果输出的内容越来越多,嵌套的代码也 会增多。那无论是编写还是阅读起来都会很恐怖。造成这种情况的罪魁祸首就是回调函数,俗称"回调地狱"
  2 Promise
   ES6中加入了一个新的对象Promise。Promise提供了一种更合理、更强大 的异步解决方案。
    new Promise(function(resolve,reject){
//dosomething
});
 异步编程概述
  1什么是异步编程?
   程序调用某个方法,等待其执行全部处理后才能继续执行,我们称其为同步的。相反,在处理完成之前就返回调用方法则是异步的。
   我们在编程语言的流程中添加了异步控制的部分,这部分的编程可以称之为异步编程。
  2异步的实现
   1.多线程
    实现异步处理,就可以通过开启多个线 程,这些线程可以同时执行。这是异步实现的一种方式。
    这种方式还是属于阻塞式:虽然我可以通过开启多个线 程来同时执行很多任务,但是每个任务中的代码仍然是同步的。当某个任务的代码执行时间过 长,也只会影响到当前线程的代码,而其他线程的代码不会受到影响。
   2.单线程非阻塞式
    把耗时 的一些操作分成两部分,先把快速能做完的事情做了,这样保证它不会阻塞其他代码的运行。剩 下耗时的部分再单独执行。这就是单线程阻塞式的异步实现机制。
  3JS中的异步实现
   JS引擎就是以单线程的机制来运行代码。那么在JS代码中想要实现异步就只有采用单线程非阻塞式的方式。
   JS引擎中执行代码的线程开始运行代码,当执行到异步方法时,把异步的回调方法放入到队列中,然后由专门计时的线程开始计时。代码 线程继续运行。如果计时的时间已到,那么它会通知代码线程来执行队列中对应的回调函数。当 然,前提是代码线程已经把同步代码执行完后。否则需要继续等待
   由于执行代码只有1个线程,所以在任何同步代码中出现死循 环,那么它后续的同步代码以及异步的回调函数都无法执行

原文地址:https://www.cnblogs.com/wwjljwx/p/11300613.html