【问题标题】:When to mark function as async何时将函数标记为异步
【发布时间】:2017-10-21 18:13:54
【问题描述】:

基本上,如果函数内部使用await,则必须以async 关键字为前缀。但是如果某个函数只是返回 Promise 并且不等待任何东西,我应该将该函数标记为async吗?

似乎两者都正确或不正确?

// with async (returns Promise)
async getActiveQueue() {
   return redisClient.zrangeAsync(activeQueue, 0, -1);
}

// difference? Both could be awaited isn't it?
getActiveQueue() {
   return redisClient.zrangeAsync(activeQueue, 0, -1);
}

【问题讨论】:

    标签: javascript asynchronous async-await ecmascript-2017


    【解决方案1】:

    如果某个函数只返回 Promise 并且不等待任何内容,我应该将该函数标记为异步吗?

    我会说你不应该。 async/await 的目的是为您创建(并解决)承诺;如果您已经承诺返回,那么async/await 不会为您带来任何好处。

    两者都可以等待不是吗?

    await 作用于承诺,而不是函数。因此,await 在任何承诺上都可以正常工作,无论该承诺是手动创建的还是由 async 在幕后创建的。

    【讨论】:

    • 使用异步改变异常处理函数的行为
    • @Eloims:确实!如果有可能抛出同步异常,我建议使用异步,它会捕获异常并用它解决承诺。
    • 将任何执行异步操作的函数标记为异步不是更好吗?
    • @Qwerty:在我的代码中,我更喜欢命名约定——Async 后缀。
    【解决方案2】:

    async keyword 不仅仅是在函数中允许await keyword。它确保您的函数将始终返回 Promise,即使引发异常也是如此。

    这里有代码 sn-ps 显示差异:

    async function f(x) {
        if (!x)
            throw new Error('failed')
    
        return new Promise((resolve, reject) => {
            resolve(x + 1);
        });
    }
    
    f(false).then(
        result => console.log('f result', result),
        error => console.log('f async error', error)
    );
    

    如果您不添加 async 关键字并且您的函数引发异常,则它不会被转换为 Promise,您必须同步捕获它。

    function g(x) {
        if (!x)
            throw new Error('failed');
    
        return new Promise((resolve, reject) => {
            resolve(x + 1);
        });
    }
    
    try {
        g(false).then(
            result => console.log('g result', result),
        )
    }
    catch (error) {
        console.log('g sync error', error);
    }
    

    【讨论】:

      【解决方案3】:

      如果您调用的函数由于某种未知原因引发错误,async 关键字将确保这将作为您的函数拒绝的承诺返回。

      async 关键字也可用于希望仅从返回值返回 Promise(例如为了 api 一致性)的函数中,而无需手动创建 Promise 对象。

      由于上述原因,我想说async 关键字并不总是与 await 配对

      【讨论】:

        【解决方案4】:

        如果您的函数“不等待任何东西” - 这是通常的函数,即使在您的返回函数内部也可能是异步的(这是封装)...

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-10-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-29
          • 2012-07-25
          • 2015-06-25
          相关资源
          最近更新 更多