# 异步方案
# 回调
简单、容易理解。
问题就是:硬编码和信任问题。 程序的流程会很混乱,而且每个任务只能指定一个回调函数。
# 事件监听
异步任务的执行不取决于代码的顺序,而是取决于某个事件是否发生。
它就跟我们 DOM 元素事件绑定一样,放置一个监听器,当事件触发之后,再来进行执行我们的交互逻辑。
jquery 写法
f1.on('done', f2); // 放置一个监听器,f1 done完成,就来触发 f2。
function f1() {
setTimeout(() => {
f1.trigger('done'); // 表示 f1 触发 done 事件。
})
}
容易理解,可以绑定多个事件,多个事件都可以指定多个回调函数。
缺点是整个程序都变成事件驱动型,运行流程会很不清晰。
# 发布/订阅
假定存在一个信号中心,某个任务执行完成,就向信号中心发布一个信号。其他任务可以向信号中心来订阅。从而执行。
function Event() {
this.handler = {};
}
Event.prototype.emit = function (eventName, eventData) {
let eventHandler = this.handler[eventName];
for (var i = 0; i < eventHandler.length; i++) {
eventHandler[i](eventData);
}
}
Event.prototype.on = function (eventName, callback) {
if (!this.handler[eventName]) {
this.handler[eventName] = [];
}
this.handler[eventName].push(callback);
}
var event = new Event();
event.on('done', (data) => {
console.log(data);
});
event.on('done', (data) => {
console.log(data);
});
event.emit('done', 1);
jquery
jQuery.subscribe('done', f2);
function f1() {
setTimeout(() => {
jQuery.publish('dome');
})
}
jQuery.unsubscribe('done', f2); // 取消订阅
我们可以通过查看消息中心,来了解存在多少信号、每个信号有多少订阅者,从而监控程序的运行。
# promise
# async函数
← 回调函数 setTimeout →