处理 Array#map 内 async/await 中的错误(拒绝)

2024-01-07

节点 8.1.2,我有一个结构,其中一个文件在映射中调用另一个文件的函数。在一个真实的例子中我会使用Promise.all on the map但这不是这里的问题。结构如下:

A.js:

const { b } = require('./B')

function expressStuff (req, res, next) {
  things.map(thing => {
    return b(thing)
  }))

  return res.status(200).json(...)
}

B.js:

// Thing -> Promise<Object>
function b (thing) {
  return ThingModel.update(...) // this returns a Promise but FAILS and throws an errror
}

module.exports = { b }

好的。所以在功能上b我尝试获取一些异步数据(从数据库)。它失败并抛出 Uncaught Promise Rejection。

该如何应对呢?

我尝试了多种解决方案:

A1.js:

const { b } = require('./B')

function expressStuff (req, res, next) {
  things.map(thing => {
    try {
      return b(thing)
    } catch (err) {
      return next(err)
    }
  }))

  return res.status(200).json(...)
}

但这仍然没有被捕获。

A2.js:

const { b } = require('./B')

function expressStuff (req, res, next) {

  try {
    things.map(thing => {
      return b(thing)
    }))
  } catch (err) {
    return next(err)
  }

  return res.status(200).json(...)
}

仍然没有处理。我尝试使用Promise.all,我尝试了双 try-catch 块(因为我认为里面的那个map可能会回来next从 到map结果而不是实际上来自expressStuff功能。依然没有。

我得到答案的最后是处理错误,但代码不会等待它被抛出,并且两者res.status() and next将导致竞争条件和cannot set headers after they are sent errors.

我想做的只是为了功能b抛出错误但将其捕获在expressStuff这样我就可以重新抛出自定义UnprocessableEntityError并将其传递给next。看起来像是文件中的错误B没有冒泡到map它被称为哪里。

我该怎么做?

EDIT:

我处理这个拒绝的唯一方法就是尝试在B.js。但如果我尝试重新抛出错误/返回它 - 什么也没有。错误被吞噬。如果我尝试console.log它 - 但它会被记录。

DETAILS:

感谢标记的答案,我重构了我的实际代码并使其完美工作。

function expressStuff (res, req, next) {
  try {
    await Promise.all(things.map(async thing => {
      if (ifSomething()) {
        await b(thing)
      }
    }))
  } catch (err) {
    return next(new MyCustomError('My Custom Error Message'))
  }

  return res.status(200).json(...)
}

处理拒绝try/catch仅适用于async function当你await承诺——你还没有尝试过。

你可以做任何一个

async function expressStuff (req, res, next) {
  var results;
  try {
    results = await Promise.all(things.map(b)); // throws when any of the promises reject
  } catch (err) {
    return next(err) // handle error
  }
  return res.status(200).json(...)
}

或(如等待所有 ES6 Promise 完成,甚至拒绝的 Promise https://stackoverflow.com/questions/31424561/wait-until-all-es6-promises-complete-even-rejected-promises)

function expressStuff (req, res, next) {
  const resultPromises = things.map(async (thing) => {
    try {
      return await b(thing); // throws when the promise for this particular thing rejects
    } catch (err) {
      return defaultValue; // handle error - don't call `next` here
    }
  });
  …
  return res.status(200).json(...)
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

处理 Array#map 内 async/await 中的错误(拒绝) 的相关文章

  • JavaScript 字符串中的脚本标签[重复]

    这个问题在这里已经有答案了 我遇到一个问题 即 JavaScript 中带引号的字符串内有结束脚本标记 并且它正在杀死脚本 我认为这不是预期的行为 可以在这里看到这样的示例 http jsbin com oqepe edit http js
  • Javascript 对象属性名称

    在 C 中 可以将对象属性的名称作为字符串值获取 名称 对象 Property gt myProperty 这可以在 Javascript Typescript 中完成吗 Object Keys 是我找到的唯一东西 但它给了我所有的键 示例
  • jQuery:查找具有特定自定义属性的元素

    我只想找到具有特定自定义属性值的元素 例如 我想找一个div其具有属性data divNumber 6 var number 6 var myDiv data divNumber number 我尝试使用http api jquery co
  • 更新存储在 chrome 扩展本地存储中的对象

    我正在开发一个 chrome 扩展 我将存储服务器发送的对象 例如 我将收到 命令 id 1 类型 A 大小 B 优先级 C 如果我有一个数据库 我会将其作为表中的一行插入commands 使用 chrome storage 我将这些对象的
  • 使用 jQuery inputmask 插件范围 0-100

    如何创建 0 到 100 范围内的掩码 document ready function masked inputmask 您可以使用jquery inputmask regex extensions js为了那个原因 你可以找到带有所有扩展
  • 如何通过setTimeout函数定期打印数字?

    var i 0 function counter for i i lt 100 i setTimeout gt console log i 2000 counter 我想以 2 秒的间隔打印 i 但它立即打印 每次打印调用只需要几微秒 为什
  • 检查用户设备的 GPS 是否开启

    我正在使用 jQuery Mobile 和 PHP 开发一个应用程序 我没有使用 Phonegap 或其他框架 我需要找到用户的geolocation 如果用户设备的 GPS 关闭 那么我无法获取位置 现在我需要查找用户设备的 GPS 是否
  • websockets 如何处理同一浏览器的两个选项卡

    I have 1 个 PHP 服务器 提供 http 请求 和 1 node js 发布更新的数据消息 每个连接都带有 websocket php 服务器设置其 cookie 在一个浏览器中 此 cookie 可在所有选项卡中使用 当浏览器
  • 可以禁用幻灯片的触摸模拟但不能禁用滚动条(危险的滑动器)吗?

    我的页面上有一个危险的滑动器 它成功地模拟了幻灯片和随附滚动条上的触摸事件 允许单击鼠标并移动以向左或向右滑动幻灯片 这很好 但我现在在滑动器内的幻灯片上调用了可拖动 这意味着我需要停止此触摸模拟 拖动幻灯片并同时移动它们会引起混乱 但仅限
  • 播放没有音频标签的音频

    是否可以在没有音频标签的情况下仅使用 javascript 播放音频 我通过 tinyMce 编辑器注入脚本 因为我无权访问网站的后端 并且它不支持客户端的音频标签 她只想要当您将鼠标悬停在图像上时发出简单的声音 我已经完成了所有设置 但是
  • 如何从 html 页面 [javascript] 调用 Web 服务方法而不刷新页面

    我有一个webservice这将返回一个值 我的要求是 我需要调用它webservice从一个index html页面 该页面有一个 html 提交按钮 在该按钮上单击我正在呼叫JavaScript 从那里我想调用网络方法 我怎样才能做到这
  • 从字节数组设置 img src

    我需要设置img src我在对象中拥有的字节数组的属性 img
  • 当php脚本通过ajax运行时显示进度条

    我有一个通过 ajax 向服务器提交值的表单
  • vuejs中如何获取组件编译后的html内容

    我有一个这样的组件
  • onPress 方法中箭头函数与普通函数的行为

    正在学习 Native React 并学习更多关于 javascript 的知识 所以我仍然不明白它的行为的很多事情 我使用 TouchableOpacity 及其 onPress 属性创建了一个按钮组件 为了让它工作 我必须发送我想要执行
  • Graphql 将多个查询合并(组合)为一个?

    我正在尝试使用 JavaScript 将多个 GraphQL 查询合并为一个查询 我正在寻找这样的东西 let query3 mergeQueries query1 query2 我们事先不知道哪些查询将被组合 假设我有这样的查询 输入查询
  • jQuery Mobile + Admob:轮换?

    我使用 jQuery Mobile 框架创建了一个移动应用程序 所有页面都在index php中加载 使用 div 在每个页面的页脚中 我添加了Admob代码 div div div
  • 将 html 文本框的值分配给 div 的标题

    line 1
  • 为什么 JavaScript 中是 [1,2] + [3,4] = "1,23,4" ?

    我想将一个数组的元素添加到另一个数组中 所以我尝试了以下方法 1 2 3 4 它的回应是 1 23 4 到底是怎么回事 The 操作员没有为数组定义 发生的事情是 JavaScript将数组转换为字符串并将它们连接起来 Update 由于这
  • 将引导程序弹出框保留在视口内

    我正在尝试使用带有按钮的侧边栏创建一个菜单 每个按钮都有一个指定的包含相关数据的弹出窗口 不幸的是 其中一个弹出窗口可能包含任意数量的行 并且在某些情况下它可能部分位于视口之外 See http jsfiddle net bfd9f 1 h

随机推荐

  • AWS Lambda 函数 - 将 PDF 转换为图像

    我正在开发应用程序 用户可以在其中上传一些 pdf 格式的图纸 上传的文件存储在S3上 上传后 文件必须转换为图像 为此 我创建了 lambda 函数 该函数将文件从 S3 下载到 lambda 执行环境中的 tmp 文件夹 然后从 ima
  • 设置 Excel 列标题格式以获得更好的可见性和颜色

    我浏览了很多帖子 但没有找到执行以下操作的确切方法 很抱歉附上屏幕截图 只是为了更好的可见性 我也会写它 基本上它看起来像 Name of the Man Address of Man City Jordan NC LMN 输入 csv 看
  • CSS 预处理器还是 PHP?

    如果我用 PHP 编写代码 是否有理由使用 CSS 预处理器而不是 PHP 例如 我可以通过在标头中添加以下内容来在 CSS 文件中使用 PHP 这样我就可以向它传递变量 例如style php color 000 或者我可以使用类似的东西
  • jq:错误:test1/0 未在 处定义,第 1 行

    我有下面的 JSON 文件 并且在尝试在 shell 中动态向数组添加值时遇到错误 下面是一个 tmp json 文件 environments integration testing for jenkins job prod stagin
  • 使用 C# 驱动程序从 mongo 集合中获取 DateTime

    我有以下对象 public class QueueItem public long id get set public SiteMapRequestState State get set public int WorkerId get se
  • 如何查找Android设备的序列号?

    我需要为 Android 应用程序使用唯一的 ID 并且我认为设备的序列号是一个不错的选择 如何在我的应用程序中检索 Android 设备的序列号 TelephonyManager tManager TelephonyManager myA
  • 如何在 QML 中设置 MessageDialog 的默认按钮?

    默认按钮是 是 但我想将按钮 否 设置为默认按钮 怎么做 我看不到任何方法可以通过当前的方式实现这一目标MessageDialogAPI 但我也认为这是特定于平台的 这就是它被隐藏的原因 不过 您可以创建自己的对话框 import QtQu
  • 通过定时器写入数据库的后台任务

    如何在后台的计时器上写入数据库 例如 检查邮件并向数据库添加新信件 在示例中 我在写入数据库之前简化了代码 Microsoft 示例中的类名称 录音类本身 namespace EmailNews Services internal inte
  • Camunda 无法执行 groovy 脚本

    这是我的依赖项 compile group org camunda bpm springboot name camunda bpm spring boot starter webapp version 3 0 0 compile group
  • 文件浏览器java

    我希望在 Java 应用程序中拥有某种文件浏览器 例如 Windows 资源管理器 我只想要能够递归列出文件夹内文件的东西 有没有一种简单的方法可以做到这一点 我已经尝试使用 JFileChooser 但这不是我想要的 此代码片段允许您递归
  • TextView android:ellipsize="marquee" 未按预期工作

    我在 ListView 中有一些自定义元素 据了解 每个元素只是 LinearLayout 中的 TextView 当文本太长时 我希望 TextView 内的文本成为水平滚动的单行 我阅读了很多关于此问题的文章 并提出了一个应该可行的解决
  • 这是“标签调度”吗?

    假设我有一些代码 void barA void barB void fooA Duplicate code barA More duplicate code void fooB Duplicate code barB More duplic
  • html中元素的排列

    可以使用 html css 实现这种结构吗 但我不想在橙色块之间留出垂直空间 而是想成为一个在另一个块的顶部 我已经使用了 flex 和 grid 但到目前为止还没有真正成功 jsfiddle https jsfiddle net 3uxc
  • VSCode 不会导入 java.awt 包

    我在我的java类中实现了ActionListener 但是当我尝试自动导入 Shift Alt O 时 它给出了这个错误 运行贡献的命令 vscode delegate cmd ksicrwzq 失败 整个代码在这里 import jav
  • 编译器错误消息:CS0433

    我会突然出现一条奇怪的错误消息 我是一个初学者 用 C 在 ASP NET 中构建一个网站 发现错误的文件是 ascx 用户控制文件 编译器错误消息 CS0433 两者中都存在类型 链接 Temporary ASP NET Files ro
  • package.json 中的本地依赖项

    我想做这样的事情 所以npm install还安装了package json of somelocallib或者更重要的是它的依赖关系 dependencies express somelocallib npm gt 2 0 0 这个功能是
  • 错误模块“QtQuick”版本 2.12 未安装

    我已经安装了 Qt 4 5 0 社区 我正在尝试使用以下命令构建我的项目Qt5 10 0 MinGW 32位 将 QtQuick 2 12 导入到 qtquick 项目的 qml 文件中后 我遇到以下错误 模块 QtQuick 版本 2 1
  • 使用 OData 服务时无法加载资源

    你好 社区 我需要一些帮助 我的 odata 服务已经在运行 并且我有一个像这样的网址 https myclient port sap opu odata SAP servicename SRV MaterialListSet https
  • 更新到 ASP NET 5 beta5 破坏了一切

    我在更新到 beta5 时遵循了本指南 并且更新过程似乎有效 http blogs msdn com b webdev archive 2015 06 30 asp net 5 beta5 now available aspx http b
  • 处理 Array#map 内 async/await 中的错误(拒绝)

    节点 8 1 2 我有一个结构 其中一个文件在映射中调用另一个文件的函数 在一个真实的例子中我会使用Promise all on the map但这不是这里的问题 结构如下 A js const b require B function e