尝试/ catchasynchronous/等待块
我正在挖掘节点7asynchronous/等待function,并像这样在代码中徘徊
async function main() { try { var quote = await getQuote(); console.log(quote); } catch(error) { console.error(error); } }
这似乎是唯一的可能性解决/拒绝或返回/抛出asynchronous/等待,但是,V8不优化代码try / catch块?
有替代品吗?
备择scheme
另一种方法是:
async function main() { try { var quote = await getQuote(); console.log(quote); } catch (error) { console.error(error); } }
会是这样的,明确地使用承诺:
function main() { getQuote().then((quote) => { console.log(quote); }).catch((error) => { console.error(error); }); }
或类似的东西,使用延续传球风格:
function main() { getQuote((error, quote) => { if (error) { console.error(error); } else { console.log(quote); } }); }
原始示例
你原来的代码所做的是暂停执行并等待getQuote()
返回的许诺来解决。 然后它继续执行,并将返回的值写入var quote
,然后在parsingpromise时将其打印出来,或者抛出一个exception并运行catch块,在承诺被拒绝时打印错误。
您可以使用Promise API直接执行相同的操作,就像第二个示例中那样。
性能
现在,为了表演。 我们来testing一下吧!
我只写了这段代码 – f1()
给出了1
作为返回值, f2()
抛出1
作为exception:
function f1() { return 1; } function f2() { throw 1; }
现在,让我们先用f1()
调用相同的代码百万次:
var sum = 0; for (var i = 0; i < 1e6; i++) { try { sum += f1(); } catch (e) { sum += e; } } console.log(sum);
然后让我们将f1()
更改为f2()
:
var sum = 0; for (var i = 0; i < 1e6; i++) { try { sum += f2(); } catch (e) { sum += e; } } console.log(sum);
这是我得到的结果f1
:
$ time node throw-test.js 1000000 real 0m0.073s user 0m0.070s sys 0m0.004s
这是我得到的f2
:
$ time node throw-test.js 1000000 real 0m0.632s user 0m0.629s sys 0m0.004s
看起来你可以在一个单线程的过程中做一些像一秒200万的事情。 如果你做的不止这些,那么你可能需要担心。
概要
我不会担心类似Node中的事情。 如果这样的事情被使用了很多,那么V8或SpiderMonkey或Chakra团队最终会得到优化,每个人都会遵循 – 它不像原则那样优化,这不是问题。
即使它没有被优化,我仍然会争辩说,如果你在Node中最大化你的CPU,那么你应该把你的编号写成C语言 – 这就是本地插件的用途。 或者,像node.native这样的东西比Node.js更适合工作。
我想知道什么是需要抛出这么多例外的用例。 通常抛出一个exception,而不是返回一个值,是一个例外。
- 在构造函数中调用asynchronous方法?
- 来自.Net 4.5的asynchronousHttpClient是密集加载应用程序的不好select吗?
- Task.Result与.GetAwaiter.GetResult()相同吗?
- 为什么我会打扰使用Task.ConfigureAwait(continueOnCapturedContext:false);
- 禁止“警告CS4014:由于此调用未被等待,当前方法的执行继续…”
- 是否有可能“等待回报DoSomethingAsync()”
- 使用async / await调用WCF服务的模式
- 我什么时候可以使用Task.Yield()?
- 为什么Thread.CurrentPrincipal需要“等待Task.Yield()”?