在涉及到有回调函数的情况下,回调函数可能是同步执行的,也可能是异步执行的。

例如:

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