Javascript 所有函数都是异步的有什么缺点吗?
较新的节点js具有async await,这非常酷,因为它使代码看起来更好 我想知道让每个类方法都异步是不是一个好主意,即使它不需要返回承诺 在我的用例中,我实际上需要这样做,因为我试图在多个子进程之间共享依赖关系,并且我使用代理和子进程通信的组合来实现这一点。显然,我需要承诺,因为我需要等待流程响应或发送消息 但这是否有任何潜在的副作用,也许是长期的 更清楚地说,我想这样做完全是为了让语法更酷Javascript 所有函数都是异步的有什么缺点吗?,javascript,node.js,asynchronous,promise,child-process,Javascript,Node.js,Asynchronous,Promise,Child Process,较新的节点js具有async await,这非常酷,因为它使代码看起来更好 我想知道让每个类方法都异步是不是一个好主意,即使它不需要返回承诺 在我的用例中,我实际上需要这样做,因为我试图在多个子进程之间共享依赖关系,并且我使用代理和子进程通信的组合来实现这一点。显然,我需要承诺,因为我需要等待流程响应或发送消息 但这是否有任何潜在的副作用,也许是长期的 更清楚地说,我想这样做完全是为了让语法更酷 const database = CreateProxy('database'); await da
const database = CreateProxy('database');
await database.something();
来自另一个进程
而有些代码只是从父进程请求一些东西
,比如
process.send('getSomethingFromDb');
在引擎盖下,两者都使用消息传递,但第一个使其看起来不像表面上那样调用
异步
函数的结果将始终是一个承诺
,而不管该函数是否实现了任何异步行为
const asyncTest = async () => 3;
console.log(asyncTest()); // logs 'Promise {<resolved>: 3}'
constasynctest=async()=>3;
console.log(asyncTest());//日志“承诺{:3}”
因此,您必须始终确保使用
wait
调用此类函数。但这纯粹是一个安慰问题,即使对你来说也是如此。而且,创建和解析承诺会为每个函数调用增加一点时间,因此如果性能非常关键,您应该避免大量调用async
函数(如果可以避免的话)。这个概念是我们的主题。没有好处,但也可能有缺点
额外的开销(CPU和时间)是问题之一。承诺需要一些时间和资源才能解决。这可能需要不到一毫秒的时间,但延迟可能会累积
另一个问题是,异步性是有传染性的,一旦它到达模块范围,async
iLife应该到处使用,因为它还不受支持:
module.export = (async () => {
await require('foo');
// await was accidentally dropped
// this results in race condition and incorrect error handling
require('foo');
...
})();
下面是一个使错误处理复杂化的缺点的好例子:
async function foo() {
throw new Error('foo');
}
async function bar() {
try {
return foo();
} catch (err) {
console.log('caught with bar');
}
}
bar(); // UnhandledPromiseRejectionWarning: Error: foo
尽管控制流看起来像是异步的,但处理错误的方式不同foo
返回拒绝的承诺,并且返回的值不使用async
函数中的try..catch
处理。拒绝将不会在栏中处理
常规函数不会出现这种情况:
function foo() {
throw new Error('foo');
}
function bar() {
try {
return foo();
} catch (err) {
console.log('caught with bar');
}
}
bar(); // caught with bar
设计为同步工作的第三方库可能会使事情变得更加复杂
我想知道让每个类方法都异步是否是个好主意,
即使它不需要回报承诺
您的代码可以工作,但我不推荐它,原因有二:
- 不必要的内存/cpu使用
- 这将使您的代码难以理解。了解哪个函数是异步的还是同步的对于理解系统如何工作以及它在做什么很重要
这并非没有一点额外的开销。诚然,我是基于使用C#而不是JS来处理项目,但很高兴知道哪些方法依赖于外部调用等,因为它们被标记为async
。不由得觉得将所有内容标记为async
会让事情变得有些混乱。是的,投票结果如何?使用.catch
子句处理错误实际上更容易:foo().catch((err)=>{})代码>无论如何都要尝试/捕获。使用async
函数的一个更好的地方是,您不需要考虑使用try/catch或使用.catch
。。。只需在同步和异步函数上使用catch
,我第一次读到它时并不明显,但它是一个未处理的PromisejectionWarning而不是“用条捕获”的原因是return foo()中缺少wait代码>。如果你等待,它就会被try/catch抓住。如果你回报承诺,这是一个未可知的错误,很好地指出了可读性是多么重要——在我看来,90%的代码都是可读的!