nodejs中的promise和async以及wait的原理

2022-07-30 09:06:39

promise的作用

  • promise的含义是保证的意思,可以定义一个异步处理的对象
  • 他有两个参数(其实是两个回调函数,因为异步操作就两种结果,ok或者不ok):
    • resolve函数是执行成功时调用的。
    • reject函数是抛出异常时调用的。
  • 于是乎我们一般这么用
    • 定义 Promise对象
var x=newPromise(function(resolve, reject){var ret=....if(ret成功){returnresolve(ret)}else{returnreject(err)}})- 对象里面包含处理过程就2个分支:- 如果返回成功,调用resolve函数把Promise实例的状态改为ok,如果失败则调用reject修改状态为失败。
  • 只要new Promise对象,就说明你执行了一个异步操作, x就是Promise对象
    • x这时已经有结果了,要么失败,要么成功; 就可以 x.then方法进行处理了 x.then(success_callback, failed_callback)。

js回调地狱

  • 如果多个连续事件,常规就是不停的callback, 有了Promise,可以then1,then2…进行链式操作, 清晰了不少

生成器和yield

  • 生成器和yield 在python中的用途: 解决了大量数据的遍历,如果都放入list,内存不够用; 如果用生成器, 生成一个值,就yield 返回去处理,处理完了,返回yield上次的位置,继续执行。
  • js中引入生成器和yield,而co模块就是巧妙的用他们控制异步编程: 比如异步操作 yield api1, 等到返回值,再yield api2, 而不用ap1.then( ap2.then )… 一层一层嵌套。
  • co这个词是协程的意思吗?感觉有点那个意思。

async 和wait

  • co模块解决了异步编程的流程控制问题,避免了层层回调
  • es7 准备引入async 和awai来更优雅的异步编程, 实际和co的原理一样,都是借助了Promise实现的。
  • await 后面一般 是Promise对象定义的异步操作
  • await只能在async里面
  • async 定义一个函数,函数里面是一堆await操作,单await 都是从上至下顺序执行的,而整个async函数返回的是一个新的Promise对象, 它相对于整个线程是不会阻塞的。他可能比较耗时
asyncfunctionA(){}A()//执行A
console.log("我先执行了哈 hello")
  • 由于A中是一堆异步执行的操作,需要有一些Promise操作,所以只能看到最后一行操作,A中的执行过程一般看不到。
  • async标识后面的函数是异步执行的,不会阻塞主线程的出来。
  • 以上是我百度的,以及 结合自己写puppeeter爬虫,了解到的async和await的操作。欢迎指点错误。

疑问

  • co模块定义的函数,保证了内部是顺序执行的,那么co定义的这个函数如果耗时很久,会阻塞后续的操作吗?
  • 作者:学而时习之2
  • 原文链接:https://blog.csdn.net/l_vim11/article/details/117172658
    更新时间:2022-07-30 09:06:39