当前位置: 首页 > 面试题库 >

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

柳绪
2023-03-14
问题内容

我正在研究节点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块中优化代码吗?

有其他选择吗?


问题答案:

备择方案

替代方法:

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进行相同的操作。

html" target="_blank">性能

现在,为了表现。让我们测试一下!

我刚才写的代码- 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更适合这份工作。

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



 类似资料:
  • 我使用async、await编写了一个Javascript代码,并在每个异步函数中使用try、catch。 假设如果我写了10个异步函数,那么我需要在所有这10个函数中写try,catch。现在我脑子里有一个问题,那就是它不会造成性能开销吗?

  • 我正在与async Wait try catch块斗争几天。 这个异步函数中的try-catch是否正确? 这就是我创建自定义错误类并全局导出的方式。 要求: 故意换了工作。我想找份工作。国际直拨电话 这样我就能抓住错误。如果有错误,则抛出新创建的自定义错误类。但抛出队列错误将导致日志记录 同样,即使不需要捕捉那个里的错误,因为try块在工作,若我抛出QueueError,我只想捕捉最后一个cat

  • 我试图在react/electron项目中使用async/await,但它不起作用。我想要的是获取docker容器状态列表。但是安慰。日志(列表)返回未定义的。 有人能帮我吗?:)

  • 我正在用。NET核心编写一个ASP.NET MVC站点。我试图封装一些常见的异常处理。在基类中,我有这个方法。 从继承自该基类的控制器中,我使用如下方法: 假设_someservice.getAsync()方法如下: 这工作得很好,将捕获基类方法中的异常并返回NotFound结果。 但是,我希望避免从SomeService.GetAsync方法调用。result。我读到的任何地方都说不要那样做,因

  • 问题内容: 给出以下代码: 产生以下错误: TS2322:类型’Promise []’无法分配给类型’number []’。类型’Promise 不可分配给类型’number’。 我该如何解决?怎样才能让和一起工作? 问题答案: 这里的问题是,您正在尝试兑现承诺而不是承诺。这没有达到您的期望。 当传递给的对象不是Promise时,只需立即按原样返回值,而不是尝试解析它。因此,由于您在此处传递了(P

  • 我试图了解 Task.Run Wait() 异步等待是如何工作的。 我已经阅读了这个页面:了解在一行中使用Task.Run Wait()异步等待的使用,但不太理解它。 在我的代码中,我从Microsoft EventHub接收事件,并使用实现的类处理它们。我在 () 中调用 方法,这是一个异步方法,这是一个方法。由于该方法是的,因此我使用 和来委派。(即 或< code >。Wait()(该方法是