Выполнять HTTP-запросы в обходном порядке - PullRequest
0 голосов
/ 13 октября 2018

Я хотел бы добиться синхронного выполнения упорядоченной последовательности 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 и ожидания ответа он просто переходит на httpReq2, , сохраняя порядок :

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 ]

0 голосов
/ 13 октября 2018

Почему бы не использовать 2 условия?

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

Редактировать: Возможно, вы хотите сохранить запросы вызовов в массивах

//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]);
  }
}
0 голосов
/ 13 октября 2018

Сортировка списка запросов, необходимых в массиве, и их последовательное выполнение, используя 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
   }
}
0 голосов
/ 13 октября 2018

Вы можете использовать async-await для достижения этого.

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

    }
}

убедитесь, что модуль запроса повторно выполняет обещание.В противном случае создайте оболочку обещания. axios - это библиотека, основанная на обещаниях.

Вы должны установить асинхронный режим перед функцией, которая включает в себя ваши ожидания

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...