我使用的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相关问答推荐

NodeJS中的Vertex AI GoogleAuthError

从目录中获取所有文件,而不是NodeJS中的单个文件

Sequelize、postgres和posgis:在n°;公里

我的 React + Express 应用程序不断向我的数组添加一个空对象

GitLab 依赖扫描需要源代码中的 package-lock.json 才能执行

AWS ECS 服务发现 Cors 问题?

如何通过node下载zip并直接解压zip?

npm install 在 Mac 上的 Node-gyp 构建错误

如何使用填充在mongoose 上保存新数据

如何找到特定文档并更新数组中特定键的值?

错误:无法检测到网络(event="noNetwork",code=NETWORK_ERROR,version=providers/5.6.8)

discordjs如何添加所有意图/权限

如果 express.js (node.js) http 请求在完成之前关闭会发生什么?

node.js 变量不存在代码块

在 Javascript 逻辑中访问 EJS 变量

分块 WebSocket 传输

为当前目录提供服务的简单文件服务器

向 Stripe 提交付款请求时出现没有此类令牌错误

如何在 node 中转义 shell 命令的字符串?

Node.js - 判断是否安装了模块而不实际需要它