异步编程之异步函数
一、简介
node.js
是一个Javascript运行环境(runtime environment),实质是对Chrome V8引擎进行了封装;node.js
不是一个 JavaScript 框架,也不是浏览器端的库,node.js
是一个让 JavaScript 运行在服务端的开发平台,它让 JavaScript 成为与PHP、Python、Perl、Ruby
等服务端语言平起平坐的脚本语言。
1.1 特点
- 异步IO
- 事件与回调函数
- 单线程(javascript语言的特点)
- 跨平台
1.2 异步IO
本文着重讲解异步编程中的异步函数,由于JS的运行机制是单线程异步执行程序,
示例:
所以在程序设定时会涉及大量异步函数,此时ES6
给我们提供了Promise
对象去封装异步操作。
const fs = require('fs');
function p1() {
// 返回promise对象return new Promise((reslove,reject)=>{
fs.readFile('./1.txt','utf-8',(err,result)=>{
if(err!=null){
// 传给外部then方法reject(err);}else{
// 传给外部catch方法reslove(result);}})
})
}
function p3() {
// 返回promise对象return new Promise((reslove,reject)=>{
fs.readFile('./3.txt','utf-8',(err,result)=>{
if(err!=null){
// 传给外部then方法reject(err);}else{
// 传给外部catch方法reslove(result);}})
})
}
function p2() {
// 返回promise对象return new Promise((reslove,reject)=>{
fs.readFile('./2.txt','utf-8',(err,result)=>{
if(err!=null){
// 传给外部then方法reject(err);}else{
// 传给外部catch方法reslove(result);}})
})
}p1()
.then((res)=>{
//接收reslove传过来的参数console.log(res);return p2();
})
.then(res=>{
//接收reslove传过来的参数console.log(res);return p3();
})
.then(res=>{
//接收reslove传过来的参数console.log(res);
})
虽然ES6
提供对的promise
对象有效解决了回调地狱以及更方便的回调函数解决方案,但这代码总会出现过长且重复代码过多的问题,于是ES7
给我们提供了一个promise
的语法糖——async/await
,这个为我们节省了大量的代码空间。接下来就介绍一下这个使用的语法糖:
异步函数是异步编程语法的终极解决方案,它可以让我们将异步代码写成同步的形式,让代码不再有回调函数嵌套,使代码变得清晰明了。
const fn = async ()=>{
};
//等同于
async function fn() {
}
async关键字
- 普通函数定义前加
async
关键字 普通函数变成异步函数 - 异步函数默认返回
promise
对象 - 在异步函数内部使用
return
关键字返回结果 结果会被包裹在promise
对象中return
关键字代替了resolve
方法 - 在异步函数内部使用
throw
关键字抛出异常 - 调用异步函数再调用
then
方法获取异步函数执行结果 - 调用异步函数再调用
catch
方法获取异步函数执行的错误信息
async function fn() {
throw '发生了一些错误';return 123;
}fn().then((data)=>{
console.log(data);
}).catch(err=>{
console.log(err);
})
await关键字
await
关键字只能出现在异步函数中await promise
await后面只能写promise
对象 写其他类型的API
是不可以的await
关键字可暂停异步函数向下执行 直到promise
返回结果
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()
}run();
nodejs中异步函数的应用
const fs = require('fs');
//改造现有异步函数api 让其返回promise对象 从而支持异步函数语法
const promisify = require('util').promisify;
// 调用promisify 方法改造现有异步API 让其返回promise对象
const readFile = promisify(fs.readFile);async function run() {
let r1 = await readFile('./1.txt','utf8');let r2 = await readFile('./2.txt','utf8');let r3 = await readFile('./3.txt','utf8');console.log(r1)console.log(r2)console.log(r3)
}run();
总结
异步函数的目的是为了让代码 的可读性更高,并且让异步执行函数在一定条件下成为同步执行函数。这样既方便代码的可执行性,也提高了代码的可读性。