# 异步方案

# 回调

简单、容易理解。

问题就是:硬编码和信任问题。 程序的流程会很混乱,而且每个任务只能指定一个回调函数。

# 事件监听

异步任务的执行不取决于代码的顺序,而是取决于某个事件是否发生。

它就跟我们 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函数