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