在涉及到有回调函数的情况下,回调函数可能是同步执行的,也可能是异步执行的。
例如:
js
function callback() {
console.log('callback')
}
function syncFn(fn) {
fn()
}
function asyncFn(fn) {
setImmediate(fn)
}
当执行:
js
syncFn(callback)
console.log('hello world')
输出为:
js
// => callback
// => hello world
当执行:
js
asyncFn(callback)
console.log('hello world')
输出为:
js
// => hello world
// => callback
然而有些场景下,可能希望回调函数总是异步执行的,此时可以使用如下方法:
js
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