尝试/ 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,而不是返回一个值,是一个例外。