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() 的相关文章

  • 在 Vue.js 中从父组件执行子方法

    目前 我有一个 Vue js 组件 其中包含其他组件的列表 我知道使用 vue 的常见方式是将数据传递给孩子 并从孩子向父母发出事件 但是 在这种情况下 我想在子组件中的按钮出现时执行子组件中的方法 parent被点击 哪种方法最好 一种建
  • Node.js:无法从同一网络上的不同设备访问服务器

    注意 还有其他一些人也遇到过类似的问题 但这些问题是通过修复代码中涉及服务器如何侦听的小花絮来解决的 在我看到的示例中 他们将 127 0 0 1 作为参数放在http createServer listen 但是 我没有同样的问题 当我尝
  • 我想检查 $('#td1').text() === "x" 是否?

    我想检查innerHtml是否有X或O 所以我不能再次添加任何其他东西 但它不起作用 添加检查代码后它就停止了 我在这里尝试做一个简单的XO游戏来更熟悉javascript和jquery 我也不确定是否可以用 jQuery 做到这一点
  • 检查 JavaScript 字符串是否为 URL

    JavaScript 有没有办法检查字符串是否是 URL 正则表达式被排除在外 因为 URL 很可能是这样写的stackoverflow 也就是说它可能没有 com www or http 如果你想检查一个字符串是否是有效的 HTTP UR
  • 如何监听 jQuery AJAX 请求?

    以下两种实现 ajaxRequest 1 2 的方法应该是等效的 话说回来 为什么验证回调已执行的单元测试 3 在 1 中成功而在 2 中失败 我应该如何重写测试 3 来监视 2 中的成功回调 如果我尝试stub jQuery ajax使用
  • 在 Node.js 中,什么是“on”?

    In 官方文档 http nodejs org docs v0 6 3 api http html http ClientResponse 有一些示例代码 var req http request options function res
  • 如何将 Google Charts 与 Vue.js 库一起使用?

    我正在尝试使用 Vue js 库使用 Google Charts 制作图表 但我不知道如何添加到 div 这是我尝试做的 这是如何使用普通 javascript 添加图表 这是文档的代码示例 https developers google
  • Jquery/Javascript 上传和下载文件,无需后端

    是否可以在没有后端服务器的情况下在 JavaScript 函数中下载和上传文件 我需要导出和导入由 JavaScript 函数生成的 XML 我想创建按钮 保存 xml 来保存文件 但我不知道是否可行 另一方面 我希望将 XML 文件直接上
  • MVC 在布局代码之前执行视图代码并破坏我的脚本顺序

    我正在尝试将所有 javascript 包含内容移至页面底部 我正在将 MVC 与 Razor 一起使用 我编写了一个辅助方法来注册脚本 它按注册顺序保留脚本 并排除重复的内容 Html RegisterScript scripts som
  • 将div设置为隐藏,延时后可见

    我试图在 X 时间后 也许甚至在随机时间之后 但现在我们只做固定时间 在黑色背景上出现一个黄色方块 function initialSetup if document getElementById yellow null document
  • 表单计算器脚本基本价格未加载 OnLoad

    我的表单中有一个计算器来计算我的下拉选项选择 function select calculate on change calc input type checkbox calculate on click calc function cal
  • Grails 在 javascript 内的 GSP 站点中使用 grails var

    我有一个在 GSP 文件中的 javascript 代码中使用 grails 变量值的问题 例如 我有一个会话值session getAttribute selectedValue 我想在 javascript 代码部分使用这个值 我现在的
  • Electron - 为什么在关闭事件时将 BrowserWindow 实例设置为 null

    The 电子文档 https electronjs org docs api browser window 提供以下代码示例来创建新窗口 const BrowserWindow require electron let win new Br
  • Angular 2+ 安全性;保护服务器上的延迟加载模块

    我有一个 Angular 2 应用程序 用户可以在其中输入个人数据 该数据在应用程序的另一部分进行分析 该部分仅适用于具有特定权限的人员 问题是我们不想让未经授权的人知道how我们正在分析这些数据 因此 如果他们能够在应用程序中查看模板 那
  • 为 illustrator 导出脚本以保存为 web jpg

    任何人都可以帮我为 illustrator CC2017 编写一个脚本 将文件以 JPG 格式导出到网络 旧版 然后保存文件并关闭 我有 700 个文件 每个文件有 2 个画板 单击 文件 gt 导出 gt 另存为 Web 旧版 然后右键文
  • HTML 离线应用程序缓存,列出下载的文件

    作为我正在构建的离线 Web 应用程序的加载屏幕的一部分 使用缓存清单 http developer apple com library safari documentation iPhone Conceptual SafariJSData
  • 如何在类似控制台的环境中运行 JavaScript?

    我正在尝试遵循这里的示例 http eloquentjavascript net chapter2 html http eloquentjavascript net chapter2 html and print blah 在浏览器中运行时
  • Javascript转换时区问题

    我在转换当前时区的日期时间时遇到问题 我从服务器收到此日期字符串 格式为 2015 10 09T08 00 00 这是中部时间 但是当我使用 GMT 5 中的 new Date strDate 转换此日期时间时 它返回给我的信息如下 这是不
  • JQuery 图像上传不适用于未来的活动

    我希望我的用户可以通过帖子上传图像 因此 每个回复表单都有一个上传表单 用户可以通过单击上传按钮上传图像 然后单击提交来提交帖子 现在我的上传表单可以上传第一个回复的图像 但第二个回复的上传不起作用 我的提交过程 Ajax 在 php 提交
  • 如何获取浏览器视口中当前显示的内容

    如何获取当前正在显示长文档的哪一部分的指示 例如 如果我的 html 包含 1 000 行 1 2 3 9991000 并且用户位于显示第 500 行的中间附近 那么我想得到 500 n501 n502 或类似的内容 显然 大多数场景都会比

随机推荐

  • 如何反序列化大 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 对于所有这些城市