javascript - 具有同步和异步代码的异步函数

标签 javascript async-await

我有返回 true 或 false 的异步函数。它看起来像以下一个:

class User {
  async canManageGroup(group) {
    if (typeof group === 'number') {
      // group - id
      group = await getGroupById(group)
    } // else group is already loaded from DB

    return this.id === group.manager.id
  }
}

如果group 参数是组的ID 那么函数将异步调用DB,所以函数canManageGroup 将异步执行。但是,如果 group 参数是组模型,那么函数只会调用 return this.id === group.manager.id 否则它将同步执行。以这种方式编写代码是一种好习惯吗?或者我应该将同步代码转换为异步代码?

function makeAsync(cb) {
  return new Promise(resolve => setImmediate(() => resolve(cb())))
}

class User {
  async canManageGroup(group) {
    if (typeof group === 'number') {
      // group - id
      group = await getGroupById(group)
    } // else group is already loaded from DB

    return await makeAsync(() => this.id === group.manager.id)
  }
}

最佳答案

您可以毫无问题地使用第一个示例。

当您使用async 时,您的函数将返回一个Promise。如果您的代码是 sync,则返回的 promise 的状态将为 resolved 并且可以安全地在其上运行任何与 promise 相关的代码(thencatch 等)。

例如:

async function truePromise() {
  return true;
}

truePromise().then(function(value){
  console.log("Promise value:", value);
});

正常工作:)

你应该这样做吗?

是的。多亏了 async 关键字,它没问题并且工作正常。

不能做的是:

function dontDoIt(doSync) {
  if (doSync) return false;
  return Promise.resolve(false)
}

为什么?因为:

  • 如果 doSync 是真实的,它将返回 false(即 bool 值)
  • 如果 doSync 为假,它将返回一个将解析为假的 Promise

这是一个巨大的差异。

为什么?

您的函数有时返回一个 promise ,有时返回一个 bool 值。这是不一致的。

  • doSync(true) 是 bool 值,您不能使用 await 或 .then。
  • doSync(false) 是一个 Promise,您可以使用 await 和 then。

关于javascript - 具有同步和异步代码的异步函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49900347/

相关文章:

javascript - 循环中的异步调用延迟

javascript - 如何使 tx.executeSql() 函数与 async/await 同步?

swift - 类属性 'current' 在异步上下文中不可用; Thread.current 不能在异步上下文中使用。这是 Swift 6 中的一个错误

c# - 取消SemaphoreSlim.WaitAsync保持信号量锁

javascript - 获取 google-apps-script 中的当前单词

javascript - Chrome DevTools 上 Node 的断点不起作用

javascript - 有没有办法用 Lerna "refresh"导入存储库?

c# - 返回任务是否违反了 CQS 原则?

javascript - 回调中的Node.js错误处理(xml-stream)

javascript - sqlite3 Node.js 数据库 Controller (this.dao.run 不是函数)