JS Tip——强制异步回调
原文链接 https://syaning.github.io/2016/08/10/jstip-always-async-callback/
注:以下为加速网络访问所做的原文缓存,经过重新格式化,可能存在格式方面的问题,或偶有遗漏信息,请以原文为准。
在涉及到有回调函数的情况下,回调函数可能是同步执行的,也可能是异步执行的。
例如:
function callback() {
console.log('callback')
}
function syncFn(fn) {
fn()
}
function asyncFn(fn) {
setImmediate(fn)
}
当执行:
syncFn(callback)
console.log('hello world')
输出为:
// => callback
// => hello world
当执行:
asyncFn(callback)
console.log('hello world')
输出为:
// => hello world
// => callback
然而有些场景下,可能希望回调函数总是异步执行的,此时可以使用如下方法:
var sync = true
syncFn(function() {
if (!sync) {
return callback()
}
process.nextTick(callback)
})
sync = false
console.log('hello world')
// => hello world
// => callback
这里使用了一个sync
标志,如果回调是同步执行的,那么就会进入process.nextTick(callback)
,从而变成异步执行;如果回调本身就是异步执行的,那么if (!sync)
会为真值,此时就直接执行回调函数就行了。
相关场景参考Express view.render