代码之家  ›  专栏  ›  技术社区  ›  nicodp

按旁路顺序执行HTTP请求

  •  0
  • nicodp  · 技术社区  · 8 年前

    我想要实现的是同步执行一个有序的HTTP请求序列,但是根据一些变量的值,我希望其中一些被旁路传递。

    例如(我使用 request 在Javascript中的库中执行此操作):

    request(httpReq1, function(error, response, body) {
      // do something, like handling errors...
      request(httpReq2, function(error, response, body) {
        // do something else
      });
    });
    

    httpReq2 将在之后执行 httpReq1 .

    我不确定的是,如果某个标志被设置为false,那么如何绕过第一个请求,而不是执行 httpReq1型 , :

    if (dontMakeHttpReq1) // where should this be placed?
    
    request(httpReq1, function(error, response, body) {
      // do something, like handling errors...
      request(httpReq2, function(error, response, body) {
        // do something else
      });
    });
    

    解决这个问题的好方法是什么?

    3 回复  |  直到 8 年前
        1
  •  2
  •   Neverever    8 年前

    整理数组中所需请求的列表,并使用 async/await

    let requests = [];
    if (doRequest1)
      requests.push(httpReq1);
    
    if (doRequest2)
      requests.push(httpReq2);
    
    /* etc .. for httpReq3 and so on */
    
    // now execute them one by one in sequence
    for(let req of requests) {
       try {
         await request(req);
       } catch (err) {
         // error handling here
       }
    }
    
        2
  •  1
  •   hdk    8 年前

    async apiCall(){ 
        try{
         if(condition){
          const result1 = await request(httpReq1);
         }
         const result2 = await request(httpReq2);
        }
        catch(error){
    
        }
    }
    

    确保请求模块运行一个承诺。否则,创建一个promise包装器。 axios 是一个基于承诺的图书馆。

        3
  •  1
  •   Darth Moon    8 年前

    if (dontMakeHttpReq1) {
      request(req1, function(error, response, body) {
        yourRequestProcessing2();
      });
    }
    else {
      request(req1, function(error, response, body) {
        request(req2, function(error, response, body) {
          yourRequestProcessing2();
        });
        yourRequestProcessing1();
      });
    }
    

    Edit:也许您想将请求调用存储在数组中

    //Whether request n should skip
    var flags = [
      false,
      true,
      false
    ];
    var requests = [
      function(error, response, body) {
        //Process your request 1
      },
      function(error, response, body) {
        //Process your request 2
      },
      function(error, response, body) {
        //Process request 3
      }
    ];
    for (i = 0; i < requests.length; i++) {
      if (flags[i]) {
        request(req1, requests[i + 1]);
      }
      else {
        request(req2, request[i]);
      }
    }
    
    推荐文章