Node_同步异步

信息获取来源Eno Yao

参考教程

runoob菜鸟教程

同步异步

同步:等待当前代码执行完毕再接着往下执行
异步:不等待当前代码执行完毕,往下执行

前端(浏览器端)

前端异步只有一下几种情况是异步

ajax xmlhttprequest
setInterval/setTimeout
jsonp

后端(服务器端node)

比前端多很多,很多方法都是异步的

fs.readFile //异步
fs.readFileSync //同步

异步一般配合回调函数,回调函数能让异步变得有意义
如果出现回调,基本上是异步

同步比异步少了回调函数

同步阻塞,相对稳定,不需要回调

异步非阻塞,相对不稳定,配合回调才有意义

下面叙述一个买pizza的故事:

有个人,他去pizza店买pizza,然而pizza需要等待10分钟,作为客户,有两种选择
等待,pizza完成后去做其他事,即为同步
不等,先去做别的事,留个电话做好叫回来拿(回调函数),即为异步
不等却没留电话(没回调函数),这个pizza就拿不到,这次操作(异步)无意义

回调嵌套

如果出现多个回调嵌套的时候,用promise来去解决这个回调地狱

function Grisaia() {
	return new Promise((resolve, reject) => {
		setTimeout(() => {
			console.log("Grisaia");
			resolve()
		}, 1000);
	})
}
function kasami() {
	return new Promise((resolve, reject) => {
		setTimeout(() => {
			console.log("kasami");
			resolve()
		}, 1000);
	})
}
function katsuki() {
	return new Promise((resolve, reject) => {
		setTimeout(() => {
			console.log("katsuki");
			resolve()
		}, 1000);
	})
}
Grisaia().then(kasami).then(katsuki);

await和async

是解决异步嵌套的一个方法,它建立在promise的基础上

function Grisaia() {
	return new Promise((resolve, reject) => {
		setTimeout(() => {
			console.log("Grisaia");
			resolve()
		}, 1000);
	})
}
function kasami() {
	return new Promise((resolve, reject) => {
		setTimeout(() => {
			console.log("kasami");
			resolve()
		}, 1000);
	})
}
function katsuki() {
	return new Promise((resolve, reject) => {
		setTimeout(() => {
			console.log("katsuki");
			resolve()
		}, 1000);
	})
}
// await一定要配合async
// 这种方式相对于promise的then调用更易于调换执行顺序
(async function () {
    await Grisaia();
    await kasami();
    await katsuki();
})()

event和观察者模式

//引入使用步骤
const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
// 监听者
// myEmitter.on('event', () => {
//   console.log('an event occurred!');
// });
// 观察者
// myEmitter.emit('event');

myEmitter.on('Grisaia', () => {
    setTimeout(() => {
        console.log('Grisaia');
        myEmitter.emit('kasami');
    }, 1000)
});

myEmitter.on('kasami', () => {
    setTimeout(() => {
        console.log('kasami');
        myEmitter.emit('katsuki');
    }, 2000)
});

myEmitter.on('katsuki', () => {
    console.log('katsuki');
});
myEmitter.emit('Grisaia');
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值