何时将函数标记为异步
When to mark function as async
基本上,如果在函数内部使用 await
,函数必须以关键字 async
为前缀。但是如果某个函数只是 returns 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);
}
如果您的函数 "doesn't awaiting for anything" - 这是常用函数,即使在您的 return 函数内部也可能是异步的(这是封装)...
if some function just returns Promise and doesn't awaiting for anything, should I mark the function as async?
我会说你不应该。 async
/await
的目的是为你创造(和解决)承诺;如果您已经承诺 return,那么 async
/await
不会为您提供该功能的任何好处。
Both could be awaited isn't it?
await
适用于承诺,而不是功能。因此,await
可以很好地处理任何承诺,无论该承诺是手动创建的还是由 async
在幕后创建的。
如果您出于某种未知原因调用的函数抛出错误,async
关键字将确保这将被 return 编辑为您的函数拒绝的承诺。
async
关键字也可以用于希望 return 仅从 return 值获得承诺(例如 api 一致性)的函数,而无需需要手动创建一个 Promise 对象。
由于上述原因,我会说 async
关键字 并不总是与 await 配对。
async
keyword is not only about allowing the await
keyword in the function. It ensures that your function will always return a 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
关键字并且您的函数引发异常,它将不会转换为承诺,您必须同步捕获它。
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);
}
基本上,如果在函数内部使用 await
,函数必须以关键字 async
为前缀。但是如果某个函数只是 returns 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);
}
如果您的函数 "doesn't awaiting for anything" - 这是常用函数,即使在您的 return 函数内部也可能是异步的(这是封装)...
if some function just returns Promise and doesn't awaiting for anything, should I mark the function as async?
我会说你不应该。 async
/await
的目的是为你创造(和解决)承诺;如果您已经承诺 return,那么 async
/await
不会为您提供该功能的任何好处。
Both could be awaited isn't it?
await
适用于承诺,而不是功能。因此,await
可以很好地处理任何承诺,无论该承诺是手动创建的还是由 async
在幕后创建的。
如果您出于某种未知原因调用的函数抛出错误,async
关键字将确保这将被 return 编辑为您的函数拒绝的承诺。
async
关键字也可以用于希望 return 仅从 return 值获得承诺(例如 api 一致性)的函数,而无需需要手动创建一个 Promise 对象。
由于上述原因,我会说 async
关键字 并不总是与 await 配对。
async
keyword is not only about allowing the await
keyword in the function. It ensures that your function will always return a 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
关键字并且您的函数引发异常,它将不会转换为承诺,您必须同步捕获它。
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);
}