nodejs本身就是异步编程,下面例子模拟读取文件,读文件最后一个参数就是回调函数
终端输出:
当用户需要获取回调函数内容,再操作内容,比如写在另一个文件output.txt,在上个回调函数里面,写入:
终端结果:
这样就会形成回调嵌套回调,如果有很多层嵌套,就是回调地狱
解决办法就是 Promise .then 和 Async/Await 下面分别介绍
什么是Promise
Promise是个对象,也是个异步代码块.有三种状态:Pending(进行中)、Resolved(已完成)和Rejected(已失败)
Promise .then 按顺序链式调用异步代码块,then有两个参数,分别是Resolved和Rejected
注意一下几点:
.then里面的第二个参数可以省略
.then里面的函数要是Promise对象,否则就不是异步调用了
学习之后 上面的读写文件就是这样的:
Promise里面的代码执行完之后,记得调用resolve(),将值或对象传给下一个Promise,不需要传可以不写.
下面的例子清晰的看到打印结果
终端可以清晰看到 2s之后打印p,再过2s打印p2,再过2s打印p3
nodejs还有种方式可以异步(Async/Await)
就是普通函数前面加上async,表明这个函数是异步,await必须要在加了async的函数里面使用.
上面的读写文件用这种方式改写就是下面的样子
与.then相比 readFile和writeFile都没有变化,都需要return Promise对象.resolve传递对象.
前面模拟延迟打印使用async await 改造就成这样了
将链式调用p().then(p2).then(p3) 改成下面的这种方式调用了