Skip to content
标签
done
字数
416 字
阅读时间
2 分钟

背景

f1 是个耗时任务,f2 需要 f1 的处理结果,在 f1 之外还有其他程序需要执行

作用

你只需要设置好异步的触发条件就可以去干别的事情了,所以异步不会阻塞主干上事件的执行

事件循环

回调函数

js
function f1(callback) {
    setTimeout(() => {
        // f1任务
        callback()
    }, 0)
}

f1(f2)

缺点:callback hell ,不利于阅读和维护,每个任务只能指定一个回调函数

事件监听

js
f1.on('done', f2)

function f1() {
    setTimeout(() => {
        // f1任务
        f1.trigger('done')
    }, 0)
}

优点:可以 多对多
缺点:整个程序变成事件驱动型,需要维护一套体系

发布订阅

js
jQuery.subscribe('done', f2)

function f1() {
  setTimeout(function () {
    // f1任务
    jQuery.publish('done')
  }, 0);
}

// jQuery.unsubscribe('done', f2)

优点:多对多,可以查询发布者和订阅者状态
缺点:需要维护一套体系

promise

js
const f1 = new Promise((resolve, reject) => {
    // f1任务
    resolve(res)
})
f1.then((res) => f2)

优点:链式调用
缺点:错误需要回调函数捕获

async 和 await

js
const f1 = new Promise((resolve, reject) => {
    // f1任务
    resolve(res)
})

async fun() {
    const res = await f1
    f2(res)
}

优点:同步形式的异步代码,能够一次处理 then 的调用链
缺点:如果多个异步代码没有依赖性却使用了 await 会导致性能上的降低,代码没有依赖性的话,完全可以使用 Promise.all 的方式

参考

Javascript 异步编程的 4 种方法 - 阮一峰的网络日志

JS 异步编程六种方案

贡献者

The avatar of contributor named as jiechen jiechen

页面历史

撰写