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关键字将确保函数将其作为拒绝的诺言返回。
async关键字也可用于希望仅从返回值返回承诺(例如,为了api一致性)的函数,而无需手动创建Promise对象。
我会说async关键字并不总是与await配对。
该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)