何时将功能标记为异步

Ale*_*rff 16 javascript asynchronous async-await ecmascript-2017

基本上,async如果await在其中使用,函数必须以关键字作为前缀.但是如果某些函数只返回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);
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*ary 12

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

我会说你不应该.async/ 的目的await是为您创造(并解决)承诺; 如果您已经承诺返回,那么async/ await将不会为您提供该功能的任何好处.

两者都可以等待不是吗?

await致力于承诺,而不是功能.因此,await无论是在手头创建还是在幕后创建承诺,任何承诺都可以正常工作async.

  • 使用 async 会改变异常处理函数的行为 (6认同)
  • 为了清楚起见,将执行异步操作的任何函数标记为异步不是更好吗? (2认同)

Mar*_* An 7

如果由于某种未知原因而调用的函数抛出错误async关键字将确保函数将其作为拒绝的诺言返回。

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

我会说async关键字并不总是与await配对


Elo*_*ims 5

async关键词不仅是让await关键字插入功能。

它确保即使引发异常,带有ALWAYS的函数也始终返回Promise。

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

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)
);
Run Code Online (Sandbox Code Playgroud)

如果您跳过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);
}
Run Code Online (Sandbox Code Playgroud)