文章目录
前言
主要讲述同步API、异步API、异步函数和promisify将异步API返回promise对象等
同步API:阻塞代码执行,从返回值中拿到执行结果。
异步API:不会阻塞代码执行,同步API执行完后才轮到异步API,通过回调函数拿到执行结果。
异步函数:在普通函数前面加上async关键字,普通函数就变成异步函数。异步函数是异步编程语法的终极解决方案,可以将异步代码写成同步的形式,让代码不再有回调函数的嵌套。return返回promise对象,throw抛出异常。await关键字只能出现在异步函数中,后面只能写promise对象,await可以把异步函数暂停执行,获取promise返回结果后,再向下执行。
promisify方法:将现有的异步API进行包装,返回一个新方法,新方法返回promise对象,用于支持异步函数语法。
一、同步API和异步API的区别
1.同步API
代码如下:
const add = (x, y) => {
return x + y
}
console.log(add(3, 7));
执行结果:
10
2.异步API
代码如下:
const getMsg = () => {
setTimeout(() => {
return { msg: 'hello world' }
}, 2000)
}
const msg = getMsg()
console.log(msg);
执行结果:
undefined//异步API不会阻塞代码执行,没有写return,默认return undefined
3.异步API通过回调函数获取值
代码如下:
const getMsg = (callback) => {
setTimeout(() => {
callback({ msg: 'hello world' })
}, 2000)
}
getMsg((data) => {
console.log(data);
})
执行结果:
{ msg: 'hello world' }//通过callback拿到执行结果
如fs模块的readfile方法,通过回调函数获取值:
readFile('/etc/passwd', (err, data) => {
if (err) throw err;
console.log(data);
});
二、异步函数
1.async关键字
代码如下:
const sayHi = async () => {
return '这是一个异步函数'
}
console.log(sayHi());
执行结果:
Promise { '这是一个异步函数' }
2.await关键字
代码如下:
const f1 = async () => {
return 'f1'
}
const f2 = async () => {
return 'f2'
}
const f3 = async () => {
return 'f3'
}
const run = async () => {
let r1 = await f1()
console.log(r1);
let r2 = await f2()
console.log(r2);
let r3 = await f3()
console.log(r3);
}
run()
执行结果:
f1
f2
f3
三、promisify方法
1.使用说明
代码如下:
const fs = require('fs')
const promisify = require('util').promisify
const readFile = promisify(fs.readFile)
console.log(readFile('./a.txt', 'utf8'));
执行结果:
Promise { <pending> }
2.以fs.readfile为例子
代码如下:
const fs = require('fs')
const promisify = require('util').promisify
const readFile = promisify(fs.readFile)
console.log(readFile('./a.txt', 'utf8'));
const run = async () => {
let a = await readFile('./a.txt', 'utf8')
console.log(a);
let b = await readFile('./b.txt', 'utf8')
console.log(b);
let c = await readFile('./c.txt', 'utf8')
console.log(c);
}
run()
执行结果:
Promise { <pending> }
这里是a文件
这里是b文件
这里是c文件
总结
代码向下执行,运到async函数中await关键字,不会阻塞代码执行,执行完代码后再返回执行await关键字代码。