尝试/ 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被拒绝则打印该错误)。
您可以像使用第二个示例一样直接使用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,而不是返回一个值,是一个例外。