在Node.js中依次循环和处理两个REST API调用

时间:2018-09-17 09:28:50

标签: javascript node.js rest

我有一个称为项目的项目列表,其中有两个文件夹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');

1 个答案:

答案 0 :(得分:1)

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

您不需要在循环中答应即可解决此问题。您的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...
}