Node.js中的异步编程


前言

主要讲述同步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关键字代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值