我如何将2个异步请求绑定在一起.post调用在Express和NodeJS

How do I tie together 2 asynchronous request.post calls in Express and NodeJS?

本文关键字:调用 post Express NodeJS 在一起 绑定 2个 请求 异步      更新时间:2023-09-26

我还在学习如何使用Express打电话。单个异步调用没有问题,但现在我有一个示例,我想将一个调用的结果提供给下一个调用。我当前的代码如下所示,这是一种非常混乱的方式,它包含了一个类似forloop的函数、一个foreach和一个Timeout。我想学习做这件事的正确方法。最好是可以缩放的。

第一个调用用工作簿列表(包括工作簿id和工作簿名称)填充结果对象getWorkbooksResponse。第二部分为该列表中的每个工作簿触发一个getViews调用。checkResponse函数对视图进行排序,并根据名称按字母顺序排列。

把两个请求联系在一起的正确方法是什么?后电话吗?我一直在看next(), bluebird, async,…但是一些例子肯定会有帮助。

var express = require('express');
var request = require('request');
var router = express.Router();
//initialize values
var workbookId = -1;
router.get('/workbooks/views', function(req, res) {
  var workgroup = req.query.workgroup;
  var authToken = req.query.auth_token;
  var serverUrl = req.query.server_url;
  //Assemble body for POST request...
  var requestedBody = {
    method: 'getWorkbooks',
    params: {
      page: {
        startIndex: 0,
        maxItems: 999
      },
      filter: {
        operator: 'and',
        clauses: []
      }
    }
  };
  //Send POST request...
  request.post({
    url: 'https://' + serverUrl + '/vizportal/api/web/v1/getWorkbooks',
    body: JSON.stringify(requestedBody),
    headers: {
      'Cookie': 'workgroup_session_id=' + workgroup + '; XSRF-TOKEN=' + authToken,
      'X-XSRF-TOKEN': authToken
    }
  }, function(err, response, body) {
    body = JSON.parse(body);
    var result = body.result;
    if (result.errors) {
      return res.json({
        http_code: 401
      });
    } else {
      getWorkbooksResponse = result;
      var getViewsWorkbooksResponse = [];
      var forloop = function(i) {
        if (i < getWorkbooksResponse.totalCount) {
          workbookId = getWorkbooksResponse.workbooks[i].id;
          var workbookName = getWorkbooksResponse.workbooks[i].name;
          request.post({
            url: 'https://' + serverUrl + '/vizportal/api/web/v1/getViews',
            body: JSON.stringify({
              method: 'getViews',
              params: {
                page: {
                  startIndex: 0,
                  maxItems: 999
                },
                filter: {
                  operator: 'and',
                  clauses: [{
                    operator: 'eq',
                    field: 'workbookId',
                    value: workbookId
                  }]
                }
              }
            }),
            headers: {
              'Cookie': 'workgroup_session_id=' + workgroup + '; XSRF-TOKEN=' + authToken,
              'X-XSRF-TOKEN': authToken
            }
          }, function(err, response, body) {
            body = JSON.parse(body);
            var result = body.result;
            if (result.errors) {
              response = {
                http_code: 401
              };
            } else {
              result.views.forEach(function(view) {
                view.workbookName = workbookName;
                getViewsWorkbooksResponse.push(view);
              });
            }
          });
          forloop(i + 1);
        } else {
          var checkResponse = function() {
            if (getViewsWorkbooksResponse) {
              //Alphabetize Response array on view name
              getViewsWorkbooksResponse.sort(function(a, b){
                return a.name.localeCompare(b.name);
              });
              return res.json({
                http_code: 200,
                response: getViewsWorkbooksResponse
              });
            }
          };
          setTimeout(checkResponse, 1000);
        }
      };
      if (getWorkbooksResponse.totalCount) {
        forloop(0);
      }
    }
  });
});
module.exports = router;

对于承诺,这将是最简单的方法:

封装请求。Post调用

new Promise((resolve,reject)=>
{ ... 
  request.post(...,function(err,response, body){
          if (result.errors){reject(/* error info here */)}
          else {resolve(/* data goes here */)}
          }
});

然后使用

Promise.all[promise1,...,promiseN].then(function(result){ //here is where you gonna do things after all requests are done })