标签
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 种方法 - 阮一峰的网络日志