5. Node.js异步编程
5.1 同步API,异步API
//路径拼接
const public = path.join(__dirname,'public');
//请求地址解析
const urlObj = url.parse(req,url);
//读取文件
fs.readFile('./demo.txt','utf8',(err,result)=>{
console.log(result)
})
同步API:只有当前API执行完成后,才能继续执行下一个API
console.log('before')
console.log('after')
异步API:当前API的执行不会阻塞后续代码的执行
console.log('before')
setTimeout(
()=>{console.log('last')
},2000)
console.log('after')
5.2 同步API,异步API的区别(获取返回值)
同步API可以从返回值中拿到API执行的结果,但是异步API是不可以的
//同步
function sum (n1,n2){
return n1 + n2
}
const result = sum(10,20)
//异步
function getMsg(){
setTimeout(function(){
return {msg:'Hello Node.js'}
},2000)
}
const msg=getMsg()
5.3 回调函数
自己定义函数让别人去调用
//getData函数定义
function getData(callback){
//getData函数调用
getData(()=>{})
}
5.4 同步API,异步API的区别(代码执行顺序)
同步API从上到下依次执行,前面代码会阻塞后面代码的执行
for(var i = 0; i < 1000000;i++){
console.log(i)
}
console.log('for循环后面的代码')
异步API不会等待API执行完成后再向下执行代码
console.log('代码开始执行')
setTimeout(()=>{console.log('2秒后执行的代码')},2000)
setTimeout(()=>{console.log('0秒后执行的代码')},0)
console.log('代码结束执行')
5.5 Node.js中的异步API
fs.readFile('./demo.txt',(err,result)=>{})
var server =http.createServer();
server.on('request',(req,res)=>{})
如果异步API后面代码的执行依赖当前异步API的执行结果,但实际上后续代码在执行的时候异步API还没有返回结果,这个问题怎么解决呢?
需求:依次读取A文件,B文件,C文件
5.6 Promise
Promise出现的目的是解决Node.js异步编程中回调地狱的问题。
let promise = new Promise((resolve,reject)=>{
setTimeout(()=>{
if(true){
resolve({name:'张三'})
}else{
reject('失败了')
}
},2000)
})
promise.then(result=>{console.log(result)})//{name:'张三'}
.catch(error=>{console.log(error)});//失败了
5.7 异步编程
异步函数是异步编程语法的终极解决方案,它可以让我们将异步代码写成同步的形式,让代码不再有回调函数嵌套,使代码变得清晰明了。
const fn = async ()=>{}
const function fn(){}
async 关键字
- 在普通函数定义的前面加上async关键字 普通函数就变成了异步
- 异步函数默认的返回值是promise对象
- 在异步函数内部使用return关键字进行结果返回 结果会被包裹在promise对象中 return关键字代替了resolve方法
- 在异步函数内部使用throw关键字进行错误的抛出
- 调用异步函数再链式调用then方法获取异步函数执行结果
- 调用异步函数再链式调用catch方法获取异步函数执行的错误信息
await 关键字 - 它只能出现在异步函数中
- await promise 它可以暂停异步函数的执行等待promise对象返回结果后再向下执行函数
- await关键字可是暂停异步函数向下执行 直到promise返回结果
async function fn(){
throw '发生了一些错误';
return 123;
}
fn().then(function(data){
console.log(data)
}).catch(function(err){
console.log(err)
})
async function p1(){
return 'p1'
}
async function p2(){
return 'p2'
}
async function p3(){
return 'p3'
}
async function run () {
let r1 =await p1()
let r2 =await p2()
let r3 =await p3()
console.log(r1)
console.log(r2)
console.log(r3)
}