【问题标题】:Looping and processing two REST API calls sequentially in Nodejs在 Nodejs 中按顺序循环和处理两个 REST API 调用
【发布时间】:2018-09-17 09:28:50
【问题描述】:

我有一个名为项目的项目列表,其中包含两个文件夹 ID。我想遍历项目列表,调用端点获取文件夹 1 中的任务,然后调用端点获取文件夹 2 中的任务,然后合并结果。我无法让这段代码按照我上面描述的顺序运行。我已经尝试过 Promises 和 Aysnc/Await,但我什么都做不了。这是我当前的代码:

function processAllTasks() {
  var emptyPromise = Promise.resolve();

  for(const Project of filteredProjects){
  emptyPromise = emptyPromise.then(function() {
    return getTasksForProjectFolderID(Project.FolderID1);
  }).then(function(result) {
    console.log(result);
    array1 = result;
    getTasksForProjectFolderID(Project.FolderID2).then(function(result2) {
      console.log(result2);
      array2 = result2;
   })
  });
}
}

其中 Array1 和 Array2 是我稍后要合并和处理的两个数组。它们是在全局范围内定义的。我的休息函数 getTasksForProjectFolderID 如下所示:

function getTasksForProjectFolderID(projectFolderID) {
  return rp({
    url: url + projectFolderID + '/tasks',
    headers: headers
  }).then(function(response) {
    return response;
  });
}

rp 是const rp = require('request-promise');

【问题讨论】:

  • 您确定getTasksForProjectFolderID() 在一次通话中正常工作吗?
  • @TaylorKrusen 是的,我在尝试循环之前单独尝试过
  • 你当前的工作有什么问题?
  • @TaylorKrusen 是的,它包含一个包含两个 ID 的对象数组
  • @Weedoze 代码只是遍历循环并为每个循环记录“未定义”

标签: javascript node.js rest


【解决方案1】:

根据经验,尽可能避免在全局范围内定义变量。如果您需要一个具有两个查询结果的对象,那么这就是您的函数应该返回的内容。

您不需要在循环中使用 Promise 来解决这个问题。您的 getTasksForProjectFolderID() 已经在处理异步调用以获取您的数据。

我会做这样的事情(这取决于您希望如何构建返回数据):

function processAllTasks(filteredProjects) {
  let results = {};

  for (const projectID of filteredProjects) {
    const taskList = getTasksForProjectFolderId(projectID)
    results['Project.FolderID'] = taskList
  }
  return results;
}

现在你的结果对象看起来像这样

{
  <First folder ID> : <Results of first query>,
  <Second folder ID> : <Results of second query>,
  etc...
}

【讨论】:

  • 抱歉,我不清楚这是如何工作的?这里有保证吗?我假设对象如下所示: { : , : , : , : 等... }
  • 这是一个使用 JSON 表示法的对象。对象没有像数组那样的隐式顺序。如果您需要有关如何组合来自您返回的响应的数据的帮助,那么您需要使用更多信息更新问题。具体来说,当您取回有效载荷时,它们会是什么样子,以及您想用它们做什么。
  • 这是一种非常基础的 JavaScript 技术,它使用字典以一种易于引用的方式存储唯一的键值对。基本上,拥有唯一键(在本例中为您的文件夹 ID)允许您引用特定值(在本例中为该文件夹 ID 查询的结果)。这是一篇不错的文章:pietschsoft.com/post/2015/09/05/…
猜你喜欢
  • 1970-01-01
  • 2020-05-13
  • 1970-01-01
  • 2021-01-17
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-15
相关资源
最近更新 更多