Nodejs:使用 async/await 时如何避免嵌套 .then()

2024-01-01

以下是我在 Node.js 中尝试执行的操作。 Rest API 将城市名称作为输入。我正在尝试使用输入城市的地理编码 API 获取纬度和经度。then,使用纬度和经度,我尝试使用另一个 API 获取最近城市的列表。then,对于所有这些城市,我正在收到天气预报,then对于这些城市,我会获取是否有水,并将其作为 JSON 返回。

正如你所看到的,有很多then本练习的目标是避免嵌套回调。

我正在使用 async/await ,它应该消除了嵌套的 then 函数。但我没有看到其他方法可以做到这一点。完整的代码片段如下。我试图修复的丑陋部分是 requester.makeRequest()

以下只是必要代码的片段,而不是完整的工作代码。任何关于如何解决这个问题的帮助将不胜感激。

app.get('/search', function(req, res, next) {
  const requester = {
      lastRequest: new Date(),
      makeRequest: async function(url) {
        const response = await fetch(url);
        const json = await response.json();
        return json;
      }
  };

requester.makeRequest(geocode_url +`?locate=${req.query.q}&json=1`
    + geocode_token)
  .then(function(city){
    var final_result = []
    var lat = city.latt;
    var long = city.longt;
    // request to get list of cities closer to that location,
    //takes latitude and longitude as parameters
    requester.makeRequest(metaweather_url + '?lattlong='
     + lat + ',' + long)
    .then(function(closer_cities) {
      var cities_len = closer_cities.length
      for(i = 0; i < closer_cities.length; i++) {
        woeid = closer_cities[i].woeid
        //request to get weather using woeid parameter
        requester.makeRequest(woeid_url + woeid)
        .then(function(weather) {
          var lattlong = weather.latt_long;
          requester.makeRequest(onwater_url+ lattlong +
          '?access_token=' + water_access_token)
          .then(function(onwater) {
            var temp = Object.assign(weather, onwater)
            final_result.push(temp)
            if (final_result.length == cities_len) {
              res.status(200).json({error: false,
                data: {message: final_result}})
            }
          })
        })
       }
      })
    })
  })

我想说你还需要一个

requester.makeRequest(geocode_url +`?locate=${req.query.q}&json=1`
    + geocode_token)
  .then(async function(city){
    var final_result = []
    var lat = city.latt;
    var long = city.longt;
    // request to get list of cities closer to that location,
    //takes latitude and longitude as parameters
    closer_cities = await requester.makeRequest(metaweather_url + '?lattlong='+ lat + ',' + long);
    var cities_len = closer_cities.length;
    for(i = 0; i < closer_cities.length; i++) {
      woeid = closer_cities[i].woeid
      //request to get weather using woeid parameter
      weather = await requester.makeRequest(woeid_url + woeid)
      var lattlong = weather.latt_long;
      onwater = await awaitrequester.makeRequest(onwater_url+ lattlong + '?access_token=' + water_access_token)
      var temp = Object.assign(weather, onwater)
      final_result.push(temp)
      if (final_result.length == cities_len) {
        res.status(200).json({error: false, data: {message: final_result}})
      }
    }
  })

编辑:我真的认为我的答案与您的问题无关,抱歉

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nodejs:使用 async/await 时如何避免嵌套 .then() 的相关文章

  • 有没有办法动态更改 jqGrid 的单元格值?

    这个问题可能已经被问过很多次了 但我想知道是否可以动态更改 jqgrid 的单元格值 我基本上有一个网格 它通过 JSON 字符串加载数据 在特定列的某些行上 该值可能为 null 因此 预先知道哪个行 ID 是一个问题 然后能够将 nul
  • JavaScript 字符串中的脚本标签[重复]

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

    我将 d3 用于交互式网络应用程序 我需要绑定的数据在交互过程中发生变化 并且由 JSON 变量中的一些选定对象组成 为此 我在 JSON 变量上使用了映射 并进行了一些查询来选择适当的对象 对象被推送到列表中 并且该列表被绑定为新数据 我
  • 判断字符串是否包含有效的javascript代码

    我正在寻找一个C 返回的函数true如果字符串包含有效的 JavaScript 语法 例如 IsValidJavascript alert hello 会回来true but IsValidJavascript alertXXhelloZ
  • 在 Firebase Cloud Functions 中仅部署单个非导出函数

    我在我的 firebase 云函数文件中创建了以下函数 function whatsMyName name return your name is name 当我在命令行中运行以下命令时 该函数is部署 firebase deploy on
  • 使用 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 但它立即打印 每次打印调用只需要几微秒 为什
  • AngularJS + jQuery 移动

    是否还有其他可能性来设计AngularJS以移动友好的方式应用程序CSS 我正在计划一个移动应用程序 并希望使用 AngularJS 进行逻辑和数据绑定 但我不想自己设计所有内容CSS The AngularJSFAQ说它使用jQuery
  • Angular 4 Http POST 不起作用

    我希望每个人都做得很好 我最近开始使用 Angular 4 4 我一直在尝试将数据发布到我的 api 服务器 但不幸的是它不起作用 我花了大约两天的时间 但仍然没有成功 甚至已经尝试过 6 7 篇文章角 io https angular i
  • 可以禁用幻灯片的触摸模拟但不能禁用滚动条(危险的滑动器)吗?

    我的页面上有一个危险的滑动器 它成功地模拟了幻灯片和随附滚动条上的触摸事件 允许单击鼠标并移动以向左或向右滑动幻灯片 这很好 但我现在在滑动器内的幻灯片上调用了可拖动 这意味着我需要停止此触摸模拟 拖动幻灯片并同时移动它们会引起混乱 但仅限
  • 如何从 html 页面 [javascript] 调用 Web 服务方法而不刷新页面

    我有一个webservice这将返回一个值 我的要求是 我需要调用它webservice从一个index html页面 该页面有一个 html 提交按钮 在该按钮上单击我正在呼叫JavaScript 从那里我想调用网络方法 我怎样才能做到这
  • 在调试模式下,使用节点检查器时,mocha 不会停止在规范文件中的调试器语句上

    当我使用 debug brk 运行 mocha 并使用 node inspector 打开 chrome 开发工具时 调试器会跳过我放入规范文件中的任何调试器语句 I can如果我遵循 则让调试器语句在模块文件中工作这个伎俩 https g
  • 如何在React中动态分配属性?

    这是一个有两个参数的函数 我要创建的标签的名称 具有以下属性的对象 Using React 我创建一个组件并将该元素渲染到 DOM 问题是我想向元素添加属性 但它不允许循环在元素内设置属性 var Element function elem
  • node.js 模块/导出系统:是否可以将模块导出为函数

    我想在 Dispatch js 中做这样的事情 function handle msg exports handle 这在调用index js中 var dispatch require Dispatch dispatch data 有任何
  • Svelte 条件元素类报告为语法错误

    我正在做一个if块每if 块的精简指南 https svelte technology guide if blocks 这看起来很简单 但 Svelte 认为这是一个语法错误 svelte plugin ParseError Unexpec
  • 了解 Document.createElement()

    我在用着GWT及其底层DOM能力 我基本上想要实现的是 Have a div包含一些文本的元素 其中一些文本将被包围span元素 span 元素可相互拖动并提供上下文菜单 New span元素可以由最终用户动态创建 它可能是这样的 在应用程
  • React Redux - 在辅助函数中访问现有存储

    我试图在反应组件之外获取存储实例 存储状态 即在单独的辅助函数中 我有我的减速器 我的动作 我在最上面的组件中创建了一个商店 configStore js import createStore from redux import gener
  • onPress 方法中箭头函数与普通函数的行为

    正在学习 Native React 并学习更多关于 javascript 的知识 所以我仍然不明白它的行为的很多事情 我使用 TouchableOpacity 及其 onPress 属性创建了一个按钮组件 为了让它工作 我必须发送我想要执行
  • 如果 POST 响应仅包含 ID,如何将数据保存到我的 Ember 存储?

    Ember 数据期望我的服务器在每次成功后返回完整的对象POST 但是 我的 API 只返回一种元对象 其中包含id 当 Ember 收到此对象时 记录中的现有数据将被删除 除了id 例如 当我这样做时 var asset App Asse
  • 如何使用socket.io发送图像文件(二进制数据)?

    我无法从以下位置发送数据Android Client to NodeJS Server I use Socket IO 客户端 https github com socketio socket io client java我的客户端中的ja

随机推荐

  • 如何反序列化大 JSON 文件 (~300Mb)

    我想解析一个JSON文件 大小 300Mb 我用Jackson图书馆和ObjectMapper 如果我出现记忆问题 这正常吗 第一次 我使用BufferedReader 它会使应用程序崩溃 接下来 我使用这个库 解析并保存到SQLite数据
  • 找到一对没有交集的对

    Given a set of n pairs of integers is there a fast way to determine if there exists two pairs x1 y1 and x2 y2 so that th
  • Xamarin Toast 消息错误 (C#)

    我想显示一条吐司消息 如果我在 onCreate 中执行此操作 效果会很好 但我想这样做 但出现错误 Java Lang NullPointerException 尝试调用虚拟方法 android content res Resources
  • GCC 链接器脚本 - 将 .bss 部分分割到多个 RAM 区域

    嵌入式设备有两个 SRAM 区域 首先位于 0x20000000 长度为 16k 然后在 0x20040000 处长度为 96k 在应用程序中 生成的 bss 部分大小为 102k 因此它不完全适合任一 RAM 区域 它需要在两个区域之间划
  • 属性路由在区域中不起作用

    场景 我的 ASP NET MVC 5 站点中有一个表单区域 我正在尝试重定向到详细信息操作 该操作使用使用新的属性路由功能定义的自定义路由 重定向到操作 return RedirectToAction Details new slug 我
  • 使用 OpenSSL 解密 .ts 文件

    一切都在同一个目录中 M3u8 文件 EXTM3U EXT X ALLOW CACHE NO EXT X TARGETDURATION 10 EXT X MEDIA SEQUENCE 0 EXT X KEY METHOD AES 128 U
  • Bootstrap 模式样式的位置固定关闭按钮在 Internet Explorer 中无法正确显示

    我正在开发一个网站 该网站使用了引导程序3 0 2版本 我设计了一个模态关闭按钮 它可以在除 Internet Explorer 之外的所有浏览器中正确显示 我已在 ie 11 上检查过 基本上 为了让它看起来像这样 我用过这个CSS mo
  • Django 过滤器错误:“Meta.fields”不得包含非模型字段名称

    我正在使用 Django REST 框架和 django filters 并且我想使用反向关系annotation set作为过滤器之一GET使用模型的 APIDetection 型号如下 class Detection models Mo
  • 使用 React Native 获取设备令牌

    有没有办法通过本机反应获取按需通知的设备令牌 从文档来看 令牌暴露的唯一时间似乎是在 PushNotification 注册事件上 更一般地说 处理设备令牌的常见做法是什么 如果一名用户登录我的应用程序 该应用程序会向 PushNotifi
  • JQuery:根据另一个元素更改高度

    我有两个 DIV 一个 DIV 根据浏览器动态更改大小 响应式设计 我希望另一个 DIV 根据第一个 DIV 的高度修改其高度 我认为最简单的方法是使用 JQuery 动态更改高度 我尝试了以下方法 section div2 css hei
  • 创建分割档案(zip、rar、7z)?

    简而言之 I need使用虚拟安全格式将单个 或多个 文件拆分为多个最大大小的存档 例如 zip 或 rar 任何有效的文件都可以 I 会爱知道某个部分何时完成 回调 这样我就可以开始将其运走 I would 而不是除非不可能 否则请使用
  • 如何重新启动 BaseHTTPServer 实例?

    这就是我所拥有的 http py class HTTPServer def init self port self port port self thread None self run True def serve self self t
  • Android 的 Scala 编程

    我已按照以下教程进行操作斯卡拉和安卓 http www scala lang org node 160 with 斯卡拉2 7 3最终的 生成的 Android 应用程序可以运行 但即使是最基本的应用程序也需要几分钟 来编译并且需要900
  • 尝试完成输入事件,但输入事件接收器已被处理错误

    我不确定我做了什么 但有一段时间我的代码运行顺利 在我添加新活动后出现错误尝试完成输入事件 但输入事件接收器已被处置 我需要有关如何解决此问题的帮助 package proj com desperationfinals import and
  • 如何在 Ruby on Rails 中阻止特定 IP 地址

    我负责一些用 Ruby on Rails 制作的实时网站 我有一些 IP 地址不断攻击这些网站 我想阻止他们的 IP 地址 我知道他们可以使用代理绕过这堵墙 但我确实希望让他们变得更难 并且很想知道我需要在 ruby on Rails 应用
  • 如何在 Selenium IDE 中使用 FirefoxDriver 通过选项使用 setExperimentalOption?

    ChromeOptions options new ChromeOptions options setExperimentalOption useAutomationExtension false options setExperiment
  • 从进程句柄获取进程信息

    我需要得到PROCESS INFORMATION在我的应用程序中使用的外部进程 我有进程句柄和进程 ID 但我不知道如何获取PROCESS INFORMATION出于那个 我正在使用 C 11 Visual Studio 2012 在 Wi
  • 如何根据 Racket Web servlet 中的路径显示不同的内容?

    我正在尝试遵循有关简单网络应用程序的 Racket 指南上的教程 但无法得到一个基本的东西 如何让 servlet 根据请求 URL 提供不同的内容 尽管我进行了搜索 但即使是巨大的博客示例也是一个大文件 并且所有内容都在我背后用巨大的 g
  • 警报对话框按钮太近

    我看到这个东西与警报对话框按钮接触 它们之间没有空格 无论使用什么主题 都会发生这种情况 代码 builder setTitle R string sign in title builder setCancelable false setP
  • Nodejs:使用 async/await 时如何避免嵌套 .then()

    以下是我在 Node js 中尝试执行的操作 Rest API 将城市名称作为输入 我正在尝试使用输入城市的地理编码 API 获取纬度和经度 then 使用纬度和经度 我尝试使用另一个 API 获取最近城市的列表 then 对于所有这些城市