一尘不染

使用异步/等待尝试/捕获块

node.js

我正在研究节点7异步/等待功能,并不断跨这样的代码绊脚

function getQuote() {

  let quote = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";

  return quote;

}



async function main() {

  try {

    var quote = await getQuote();

    console.log(quote);

  } catch (error) {

    console.error(error);

  }

}



main();

这似乎是使用异步/等待解决/拒绝或返回/抛出的唯一可能性,但是,v8不会在try / catch块中优化代码吗?

有其他选择吗?


阅读 203

收藏
2020-07-07

共1个答案

一尘不染

备择方案

替代方法:

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,如果承诺已解决,则将其打印;如果承诺被拒绝,则抛出异常并运行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 
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更适合这份工作。

我想知道什么是用例,需要抛出这么多异常。通常,抛出异常而不是返回值是一个异常。

2020-07-07