Javascript 何时将函数标记为异步

Javascript 何时将函数标记为异步,javascript,asynchronous,async-await,ecmascript-2017,Javascript,Asynchronous,Async Await,Ecmascript 2017,基本上,如果函数中使用了wait,则该函数必须以async关键字作为前缀。但是,如果某个函数只是返回承诺而不等待任何东西,我是否应该将该函数标记为async 看起来两者都对还是不对 // with async (returns Promise) async getActiveQueue() { return redisClient.zrangeAsync(activeQueue, 0, -1); } // difference? Both could be awaited isn't i

基本上,如果函数中使用了
wait
,则该函数必须以
async
关键字作为前缀。但是,如果某个函数只是返回承诺而不等待任何东西,我是否应该将该函数标记为
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);
}
如果您的函数“不等待任何东西”-这是通常的函数,即使在您的返回函数中也可能是异步的(这是incapsulation)

如果某个函数只返回Promise而不等待任何东西,我应该将该函数标记为async吗

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

这两个都可以期待,不是吗


wait
是基于承诺而不是功能。因此,
await
在任何承诺上都可以正常工作,无论该承诺是手动创建的还是由
async

在幕后创建的,如果您出于未知原因调用的函数抛出错误
async
关键字将确保函数将此作为拒绝的承诺返回

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


我想说的是
async
关键字并不总是与wait
配对关键字
async
不仅仅是允许
wait
关键字进入函数

它确保您的函数始终返回承诺,即使在引发异常时也是如此

以下是显示差异的代码片段:

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关键字,并且函数引发了异常,那么它将不会转换为承诺,您需要同步捕获它

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);
}

使用async会更改异常函数的行为handling@Eloims:真的!如果有可能引发同步异常,我建议使用async,它将捕获异常并用它解决承诺。为清晰起见,将任何执行异步操作的函数标记为async不是更好吗?@Qwerty:在我的代码中,我更喜欢命名约定-一个
async
后缀。