何时将功能标记为异步

时间:2017-05-22 07:22:16

标签: javascript asynchronous async-await ecmascript-2017

基本上,如果async内部使用await,则必须使用async关键字作为前缀。但是如果某些函数只返回Promise并且没有等待任何东西,我应该将函数标记为// 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); } 吗?

似乎是否正确?

ngModel name="currentPassword" #currentPassword="ngModel 

4 个答案:

答案 0 :(得分:12)

  

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

我会说你不应该。 <div class="testbox"> <span class="item">1 Lorem ipsum dolor sit amet.</span> <span class="item">2 Soluta officia aut dolorem, doloribus!</span> <span class="item">3 Accusamus et quibusdam aliquid ullam.</span> <span class="item">4 Magnam fugit temporibus, minus ut?</span> <span class="item">5 Laborum corporis quidem eum esse.</span> </div> / async的目的是为您创造(并解决)承诺;如果您已经承诺退回,那么await / async将不会为您提供该功能的任何好处。

  

两者都可以等待不是吗?

await致力于承诺,而非功能。因此,await适用于任何承诺,无论该承诺是由await手动创建还是在幕后创建的。

答案 1 :(得分:6)

如果您因某种未知原因而调用的功能会引发错误,则async关键字将确保将作为被拒绝的承诺返回你的功能。

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

我会说{{1}}关键字并不总是与等待配对。

答案 2 :(得分: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)
);

如果跳过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 :(得分:0)

如果你的功能“不等待任何事情” - 这是常用的功能,即使你的返回功能内部也可能是异步(这是封装)......