基本上,如果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
答案 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)
如果你的功能“不等待任何事情” - 这是常用的功能,即使你的返回功能内部也可能是异步(这是封装)......