promise的作用
promise的含义是保证的意思,可以定义一个异步处理的对象 他有两个参数(其实是两个回调函数,因为异步操作就两种结果,ok或者不ok):
resolve函数是执行成功时调用的。 reject函数是抛出异常时调用的。 于是乎我们一般这么用
var x = new Promise ( function ( resolve, reject) {
var ret = ... .
if ( ret成功) {
return resolve ( ret)
} else {
return reject ( 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对象, 它相对于整个线程是不会阻塞的。他可能比较耗时
async function A ( ) { }
A ( )
console. log ( "我先执行了哈 hello" )
由于A中是一堆异步执行的操作,需要有一些Promise操作,所以只能看到最后一行操作,A中的执行过程一般看不到。 async标识后面的函数是异步执行的,不会阻塞主线程的出来。 以上是我百度的,以及 结合自己写puppeeter爬虫,了解到的async和await的操作。欢迎指点错误。
疑问
co模块定义的函数,保证了内部是顺序执行的,那么co定义的这个函数如果耗时很久,会阻塞后续的操作吗?