同步和异步代码的异步功能

时间:2018-04-18 12:57:06

标签: 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)
  }
}

3 个答案:

答案 0 :(得分:1)

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

当您使用async时,您的函数将返回Promise。如果您的代码为sync,则返回的承诺的状态为resolved,并且可以安全地在其上运行任何与承诺相关的代码(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(即布尔值)
  • 如果doSync是假的,它将返回Promise,将解析为false。

这是一个巨大的差异。

为什么?

您的函数有时会返回一个promise,而其他时候会返回一个布尔值。这是不一致的。

  • doSync(true)是一个布尔值,你不能使用await或.then。
  • doSync(false)是一个Promise,你可以使用await然后。

答案 1 :(得分:0)

第一个是正确的。如果不需要,就没有必要强迫任何异步。上下文切换不是免费的,因此如果它不必等待任何事情完成,请不要尝试制作它。

答案 2 :(得分:0)

基于您对其中一个答案的评论,因为问题的回答为How do you create custom asynchronous functions in node.js?

  问题是,这个函数是不一致的:有时它是异步的,有时它不是。假设您有这样的消费者:

在js环境中,像nodejs这样的常见做法是,无论实际代码是否真的异步,都应该始终将异步执行的回调称为异步。

所以你想知道以下代码是否会破坏这种常见的实践。

async function doSomething() {
  return true
}

doSomething()
.then(res => {
   console.log(res)
})

情况并非如此,因为在这里你处理Promises并且允许一个Promise立即解决,上面的代码基本上和你写的一样:

Promise.resolve(true)
.then(res => {
   console.log(res)
})

链接部分(then / catch)确保了异步行为,您传递给then / catch的回调将被称为异步:



async function doSomething() {
  return true
}

console.log('before');

doSomething()
  .then(res => {
    console.log('with in callback')
  })

console.log('after');




正如您所看到的,日志的顺序是:

  

之前
  
后   在回调中

因此,这与常规异步回调函数所期望的顺序相同。