Node.js异步编程
同步API:只有当前API执行完成后,才能执行下一个API
console.log('123'); console.log('234'); // 123 234
异步API:当前API的执行不会阻塞后续代码的执行
console.log('123'); setTimeout( ()=>{ console.log('456'); },2000 ); console.log('234'); // 123 234 456
promise
作用:解决异步API中的回调地狱的问题
let promise = new Promise((resolve,reject)=>{
setTimeout(()=>{
if(true)
{
resolve({name:'张三'})
}
else{
reject('失败了')
}
},2000);
})
promise.then()//成功则调用此方法
.catch()// 失败则用此方法
在普通函数前加上async关键字,就变成了异步函数
const fn = async()=>{}
异步函数默认返回值是promise对象
在异步函数内部使用throw关键字进行错误的抛出
await关键字只能出现在异步函数中,他可以暂停异步函数的执行 等待promise对象返回结果后 在向下执行函数
await关键字
async function p1(){
return '1';
}
async function p2(){
return '2';
}
async function p3(){
return '3';
}
async function run(){
let a = await p1();// 直到promise返回结果 异步函数才可以向下执行
let b = await p2();
let c = await p3();
console.log(a);
console.log(b);
console.log(c);
}
run();// 1 2 3
- await关键字只能出现在异步函数中
- await右侧表达式为promise的话,得到的结果为promise成功的值;如果右侧表达式不是promise,得到的结果就为右侧表达式返回的值。
- await关键字可以暂停异步函数向下执行 直到promise返回结果
异步函数在Node.js中的应用
const fs = require('fs');
// 改造现有异步函数API 让其返回promise对象 从而支持异步函数语法
const promisify = require('util').promisify();
const readfile = promisify(fs.readFile);
async function run(){
let a= await readfile('./1.txt','utf8');
let b= await readfile('./1.txt','utf8');
let c= await readfile('./1.txt','utf8');
console.log(a);
console.log(b);
console.log(c);
};
run();// 1 1 1