替代方法:
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()解决。然后,它继续执行,并将返回的值写入
varquote,如果承诺已解决,则将其打印;如果承诺被拒绝,则抛出异常并运行catch块,打印错误。
您可以像第二个示例一样直接使用Promise API进行相同的 *** 作。
性能现在,为了表现。让我们测试一下!
我刚才写的代码-
f1()给
1作为返回值,
f2()抛出
1一个例外:
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 1000000real 0m0.073suser 0m0.070ssys 0m0.004s
这是我得到的
f2:
$ time node throw-test.js 1000000real 0m0.632suser 0m0.629ssys 0m0.004s
看起来您可以在一个单线程进程中每秒执行200万次抛出。如果您要做的还不止这些,那么您可能需要担心。
摘要我不会担心Node中的问题。如果像这样的事情被广泛使用,那么它最终将由V8或SpiderMonkey或Chakra团队进行优化,并且每个人都会效仿-
这并不是说它没有作为一个原则进行优化,这不是问题。
即使未进行优化,我仍然会争辩说,如果您要在Node中最大化CPU,那么您可能应该在C语言中编写数字运算法则-
这就是本机插件的用途。或者也许像node.native这样的事情比Node.js更适合这份工作。
我想知道什么是用例,需要抛出这么多异常。通常,抛出异常而不是返回值是一个异常。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)