syncApply ({timeout, fn, args = [], scope = this}) {
  return new Promise((resolve, reject) => {
    try {
      setTimeout(() => {
        resolve(fn.apply(scope, args))
      }, timeout)
    } catch (err) {
      reject(err)
    }
  })
}