信息获取来源Eno Yao
参考教程
同步异步
同步:等待当前代码执行完毕再接着往下执行
异步:不等待当前代码执行完毕,往下执行
前端(浏览器端)
前端异步只有一下几种情况是异步
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');