使用 Axios 在 Node.js 中克服 Pending Promise 并完成构建 JSON

     2023-03-08     246

关键词:

【中文标题】使用 Axios 在 Node.js 中克服 Pending Promise 并完成构建 JSON【英文标题】:Overcome Pending Promise and Finish Building JSON in Node.js with Axios 【发布时间】:2019-04-06 06:58:30 【问题描述】:

我正在尝试通过连续使用HTTP requestsAxios 来构建JSON 文件:

    获取对象(项目)数组 在每个名为 tasks 的项目中创建一个数组属性 获取每个项目的任务 将每个项目的任务推送到其任务属性中(即在每个项目对象中填充该数组) 从修改后的项目数组中创建一个JSON 文件

代码:

let getProjects = function() 
  try 
    return axios.get('https://app.asana.com/api/1.0/projects/').then(response =>  return response  )
   catch (error) 
    console.error(error)
  


let getTasks = function(project) 
  try 
    return axios.get('https://app.asana.com/api/1.0/projects/'+project+'/tasks').then(response =>  return response  )
   catch (error) 
    console.error(error)
  


function getAsanaData() 
  return getProjects()
    .then(function(result) 
      let projects = []
      for(let project of result.data.data)
        project.tasks = []
        project.tasks.push(getTasks(project.gid))
        projects.push(project)
      
      return projects;
    )


Promise.try(() =>     
    return getAsanaData();
).then((result) => 
    console.log(util.inspect(result, showHidden: false, depth: null))
    var asanaData = JSON.stringify(result);
    fs.writeFile("thing.json", asanaData);
);

日志结果是这样的:

[  id: 35534235917762,
    gid: '35534235917762',
    name: 'History+',
    resource_type: 'project',
    tasks: [ Promise  <pending>  ] ,
   id: 35583453238038,
    gid: '35583453238038',
    name: 'NRG - AccountingSeed Phase 2',
    resource_type: 'project',
    tasks: [ Promise  <pending>  ] ,
]

注意Promise &lt;pending&gt; 的持久化。

JSON 是这样的:

[
  
    "id": 35534235917762,
    "gid": "35534235917762",
    "name": "History+",
    "resource_type": "project",
    "tasks": [
      
    ]
  ,
  
    "id": 35583453238038,
    "gid": "35583453238038",
    "name": "NRG - AccountingSeed Phase 2",
    "resource_type": "project",
    "tasks": [
      
    ]
  
]

注意空任务属性。

似乎我已经非常接近完成一个完整的JSON,但我花了很多时间试图通过待处理的promise 并最终添加缺失的数据。

我需要做什么?

【问题讨论】:

【参考方案1】:

问题在于getTasks 是异步的,因此在for 循环中简单地调用getTasks 不会等待Promise 解决。要等待它们全部解决,请在这些 Promise 的数组上使用 Promise.all,然后当 that 解决时,您可以将结果分配给 project.tasks

function getAsanaData() 
  return getProjects()
    .then((result) => 
      const projects = result.data.data;
      const taskPromises = projects.map((project) => 
        return getTasks(project.gid)
          .then((task) => 
            project.tasks = [task];
          );
      );
      return Promise.all(taskPromises)
        .then(() => projects);
  );

另请注意,被拒绝的 Promise 不会被捕获在 try / catch 块内:

try 
  new Promise((_, reject) => setTimeout(reject, 1000))
 catch(e) 
  console.log('error caught');

代替try/catch,捕获Promise 错误(当您不使用await 时)的正确方法是在Promise 链的末尾链接.catch 处理程序:

const getProjects = function() 
  return axios.get('https://app.asana.com/api/1.0/projects/')
    .catch((error) => console.error(error));

但是.catch导致Promise解析,而不是拒绝,这意味着当函数被调用时,得到的Promise解析为一个值 (undefined) 而不是拒绝,这可能不是您想要的 - 如果您在函数的 调用者 中捕获错误,您可能会发现控制流更容易处理:

return Promise.all(taskPromises)
  .then(() => projects);
  .catch((err) => 
    console.log(err);
  );

还有一点需要注意的是.then 比如

.then(response =>  return response  )

完全是多余的——现有的Promise 已经解析为response。将另一个Promise 链接到最后,它接收输入并再次输出它并没有做任何有用的事情 - 随意完全关闭它。

【讨论】:

【参考方案2】:

您可以尝试使用 async await 语法来编写异步代码,例如使用 Promise 进行同步。 理解并遵循完整的承诺可能很简单。 示例:

我们可以像这样覆盖你的 getProject 函数:

let getProjects = async function() 

   let projectsResponse;
   try 
     projectsResponse = 
        axios.get('https://app.asana.com/api/1.0/projects/');
    catch (error) 
      console.error(error)
   

   return projectsResponse && projectsResponse.data || [];

【讨论】:

如何使用 Axios 在 Node.js 中过滤 JSON 数据?

】如何使用Axios在Node.js中过滤JSON数据?【英文标题】:HowcanIfilteraJSONdatainNode.jsusingAxios?【发布时间】:2021-12-2605:13:18【问题描述】:我是新手后端开发人员,我正在尝试使用Node.js构建一个RESTAPI以从Pipedrive赢得交易。我已经有一... 查看详情

如何在 node.js 中使用 axios 循环许多 http 请求

】如何在node.js中使用axios循环许多http请求【英文标题】:Howtoloopmanyhttprequestswithaxiosinnode.js【发布时间】:2022-01-0507:54:59【问题描述】:我有一个用户数组,每个用户都有一个IP地址。我有一个API,我将IP作为请求发送,它返回属... 查看详情

axios使用总结(代码片段)

...、在node.js中发送http请求等等应用场景:在Vue开发项目中使用Axios框架简单使用安装npminstallaxios--save在main.js中 查看详情

使用 AXIOS (Node.js) 在请求之间保留 cookie

】使用AXIOS(Node.js)在请求之间保留cookie【英文标题】:PerservecookiesbetweenrequestsusingAXIOS(Node.js)【发布时间】:2020-12-2616:43:47【问题描述】:$节点-vv10.15.0"axios":"^0.19.2",我试图阻止响应标头字段“set-cookie”中的cookie-就像浏览器一样... 查看详情

vueaxios详解

...(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生node.js​​http​​模块,而在客户端(浏览端)则使用XMLHttpRequests。1.2Axios的特性从浏览器创建XMLHttpRe 查看详情

反应 js:axios 向 node.js api 发布请求

...api【发布时间】:2018-12-1107:29:33【问题描述】:嗨,我在使用axios发送请求中的所有数据时遇到了一些问题。我创建了node.jsapi,现在我想使用axios从我的表单发送用户注册数据,并将reactjs作为我的前端技术。我在提交后更新了我... 查看详情

axios介绍和使用(代码片段)

...请求自动转换JSON数据客户端支持防御XSRF二、Axios的基本使用1、Axios安装方法使用npm:$npminstallaxios使用bower:$bowerins 查看详情

axios使用总结(代码片段)

...功能。自从vue2.0之后,就不再对vue-resource更新,而是推荐使用axios技术详述使用方法在安装完成VUE后安装Axiosnpminstall--saveaxiosvue-axios从VUE框架中引入Axios,以便使用 查看详情

vue安装并使用axios发送请求(代码片段)

前言本文主要介绍的是使用在Vue项目中安装并使用axios发送请求axios介绍axios是一种Web数据交互方式它是一个基于promise的网络请求库,作用于node.js和浏览器中,它是isomorphic的(即同一套代码可以运行在浏览器和node.js中)本... 查看详情

vue中axios怎么分服务

...以后帮助到你。 参考技术B1、在服务端:在服务端,可以使用Node.js的axios模块来发送HTTP请求,以获取服务端数据。2、在客户端:在客户端,可以使用Vue.js的axios插件来发送HTTP请求,以获取客户端数据。 参考技术CVue中可以使用Ax... 查看详情

axios的基本使用(代码片段)

Axios是一个基于promise的HTTP库,可以用在浏览器和node.js中。  1.从浏览器创建XMLHttpRequests  2.从node.js创建http请求  3.支持PromiseAPI  4.拦截请求和响应  5.转换请求数据和响应数据  6.取消请求  7.自动转换JSON数据 ... 查看详情

vue中使用axios拦截器(拦截请求与相应)

Axios是一个基于promise的HTTP库,可以用在浏览器和node.js中。Features从浏览器中创建 XMLHttpRequests从node.js创建 http 请求支持 Promise API拦截请求和响应转换请求数据和响应数据取消请求自动转换JSON数据客户端支持防御 XSRF引用... 查看详情

Node.js / Axios 不会连接到 localhost

...计算机上本地运行。它有一个RPCAPI,我已经测试过我可以使用curl成功调用它。例如curl-d\'"action":"account_balance" 查看详情

axios发送请求(代码片段)

...iseAPI4.拦截请求和响应数据二、axios的请求方式:三、使用axios1.安装axios:npminstallaxios2.在main.js中导入axiosimportaxiosfrom'axios'//安装完之后,导入axios3.设置全局配置 请求默认根路径//配置请求根路径axios.defaults.baseU... 查看详情

axios在vue项目中的安装使用以及基本的请求方法

...器和Node.js中发起Http请求和处理响应。它提供了一种易于使用、灵活和强大的方式来与服务器进行数据通信。Axios具有一些有用的特性,如自动转换json响应、请求/响应拦截、取消请求等等。它也是Vue.js官方推荐的Http库之一。如... 查看详情

axios使用总结(代码片段)

功能简介:axios是第三方封装库,作用是在框架中使用数据请求安装:npminstallaxios–S在Vue项目文件中的main.js文件,定义axios请求类的全局引用。核心代码如下 特点:1.它在浏览器中创建的是浏览器对象2.它底... 查看详情

node.js - Passport 不会在浏览器请求中持续存在,可与 Postman 一起使用

...de.js-Passport不会在浏览器请求中持续存在,可与Postman一起使用【英文标题】:node.js-Passportnotpersistingacrossbrowserrequests,workswithPostman【发布时间】:2018-02-0815:42:59【问题描述】:我目前正在使用create-react-app样板,并一直在尝试添加... 查看详情

上传图片文件到服务器node.js express axios

...一直在尝试上传图像文件并将其保存到我的后端。我正在使用axios从反应前端调用expressAPI。前端在端口3000上运行后端运行端口8080exportfunctionupdateSociete(data)ret 查看详情