我使用的promise 和代码如下所示:

function getStuff() { 
  return fetchStuff().then(stuff => 
    process(stuff)
  ).catch(err => {
    console.error(err);
  });
}

或者:

async function getStuff() { 
  try {
    const stuff = await fetchStuff();
    return process(stuff);
  } catch (err) { 
    console.error(err);
  }
}

我这样做是为了避免遗漏错误,但一位用户告诉我,我不应该这样做,这是不赞成的.

  • return ….catch(err => console.error(err))怎么了?
  • 我见过很多这样做的代码,为什么?
  • 我该怎么办?

推荐答案

为什么旧代码会这样做?

从历史上看,旧的(2013年之前)promise 库"吞下"了你自己没有处理过的未经处理的promise 拒绝.从那以后,任何书面文件都没有出现这种情况.

今天发生了什么?

浏览器和 node .js已经自动记录未捕获的promise 拒绝或有处理它们的行为,并将自动记录它们.

此外,通过添加.catch,您正在向调用函数undefined的方法发送信号:

// undefined if there was an error
getStuff().then(stuff => console.log(stuff)); 

在编写异步代码时,人们应该问自己的问题通常是"同步版本的代码会做什么?"

function calculate() { 
  try {
    const stuff = generateStuff();
    return process(stuff);
  } catch (err) { 
    console.error(err);
    // now it's clear that this function is 'swallowing' the error.
  }
}

我认为如果出现错误,消费者不会期望这个函数返回undefined.

总而言之,人们不赞成它,因为它让应用程序流程中的开发人员感到惊讶,而且浏览器在今天仍然会记录未捕获的promise 错误.

如何取而代之:

Nothing.这就是它的美妙之处——如果你写道:

async function getStuff() { 
  const stuff = await fetchStuff();
  return process(stuff);
}
// or without async/await
const getStuff = fetchStuff().then(process);

首先,你会得到大约anyway个更好的错误:)

如果运行的是旧版本的Node,该怎么办.js?

Node的旧版本.js可能不会记录错误或显示弃用警告.在这些版本中,您可以使用console.error(或适当的日志(log)记录工具)globally:

// or throw to stop on errors
process.on('unhandledRejection', e => console.error(e));

Node.js相关问答推荐

可以删除一个mongodb catch块

运行JEST测试时找不到模块&q;错误

如何在mongodb集合中设置数据限制?

使用NodeJS的DynamoDB中的BatchGetItem出现MultipleValidationError

Webpack:如何避免导出函数的重命名?

React原生Nodejs兼容性问题

验证器功能在mongoose 中不起作用

如何创建具有不同对象类型的数组类型

我的 MERN 网站一直告诉我我的一个函数不是一个函数

编写动态创建的 YAML - 为生态系统创建 Docker compose 文件(使用 js-yaml)

AWS ECS 服务发现 Cors 问题?

为什么 FastAPI 需要 Web 服务器(即 Nginx)而不是 Express API?

try 在 NodeJS 项目中实现 SimplePay (OTP) 支付网关,但我无法获得与技术文档中相同的签名

如何解决这个关于 TaskRunner 的 Node/Express 代码问题?

Zod 模式中的self 数组

将已保存的卡片从条带显示到前端

使用 nvm-windows 时更新 npm

nodejs v10.3.0 的 gulp 任务问题:src\node_contextify.cc:629: Assertion `args[1]->IsString()' failed

fs.createWriteStream 不会立即创建文件?

用于轻松部署和更新的 Node.js 设置