повторять запрос каждый раз, когда другой запрос завершается неудачей в nodejs - PullRequest
0 голосов
/ 21 декабря 2018

Я пытаюсь сделать запрос через прокси, но в некоторых ситуациях этот прокси не работает, поэтому мне приходится использовать другой прокси.это все круто, но дело в том, что прокси, который я использую, генерируется по предварительному запросу в том же коде, поэтому для использования другого прокси мне нужно запросить его снова, и я не знаю, как это сделать со второго запросанаходится внутри первого (потому что иначе я не могу использовать результат первого возвращенного запроса).Вот как выглядит мой код:

function asyncreq(url, proxy) {
  return new Promise(resolve => {
    request({
      url: url,
      proxy: proxy
    }, function(error, response, body) {
      if (typeof response !== 'undefined') {
        if (response.statusCode == 200) {
          resolve(response);
          return;
        }
        resolve(response)
        return;
      }
      resolve(error)
    });
  });
}

asyncreq("http://pubproxy.com/api/proxy?api=" + myapikey + "&type=http&country=fr&format=txt&https=true&post=true").then(function(result) { //FIRST REQUEST
  if (result.statusCode == 200 && result.body.includes("http://") == false) {
    var proxy = result.body;
    console.log("using proxy: " + proxy)
    asyncreq("https://haapi.ankama.com/json/Ankama/v2/Account/CreateGuest?game=20&lang=fr", "http://" + proxy).then(function(result) { //SECOND REQUEST
      if (JSON.parse(result.body).key == undefined) {
        // DO STUFF IF IT IS A SUCESS (If it matters, here i intend to make a third request)
      } else {
        console.log(JSON.parse(result.body).key) //HERE I MUST JUMP TO FIRST REQUEST AGAIN
      }
    })
  } else {
    console.log("Error: " + result.body)
  }
}) 

Я пытался вернуть значение в случае сбоя, а затем выполнить цикл while, но он не работает, потому что я не могу использовать возвращенное значение внефункция

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Вы можете заархивировать это задание с помощью метода хвостовой рекурсии.

После второго запроса вам нужно выбрать, повторять ли первый или переходить к третьему.Благодаря цепочке обещаний вы можете прикрепить обещание к цепочке и всем ее дочерним элементам (.then).

Этот пример должен работать:

function asyncreq(url, proxy, validateResponse) {
  return new Promise((resolve, reject) => {
    request({ url, proxy }, function (error, response, body) {
      if (response && validateResponse(response)) {
        resolve(response)
        return;
      }
      reject(response || error)
    });
  });
}

let sharedProxy;    

function firstRequest(myapikey) {
  const firstCallValidation = (response) => {
    return typeof response !== 'undefined' && result.statusCode == 200 && result.body.includes("http://") == false;
  }

  return asyncreq(`http://pubproxy.com/api/proxy?api=${myapikey}&type=http&country=fr&format=txt&https=true&post=true`, null, firstCallValidation)
    .then(function (result) { //FIRST REQUEST
      var proxy = result.body;
      console.log("using proxy: " + proxy)
      sharedProxy = proxy;
      return secondRequest(proxy)
    })
    .then(function (result) { //SECOND REQUEST
      if (JSON.parse(result.body).key == undefined) {
        // DO STUFF IF IT IS A SUCESS (If it matters, here i intend to make a third request)
        return thirdRequest(sharedProxy);
      }
      //HERE I MUST JUMP TO FIRST REQUEST AGAIN
      const apiKey = JSON.parse(result.body).key
      return firstRequest(apiKey)
    });
}

function secondRequest(proxy) {
  return asyncreq("https://haapi.ankama.com/json/Ankama/v2/Account/CreateGuest?game=20&lang=fr", "http://" + proxy, () => true)
}

function thirdRequest(proxy) {
  return asyncreq("https://ha...." + proxy);
}

// Start!!
firstRequest()
  .catch((err) => {
    console.log("Error: ", err)
  })
0 голосов
/ 21 декабря 2018

Включите reject в свое обещание: return new Promise((resolve, reject) => { reject(error) }, а затем снова позвоните asyncreq при отклонении вашего обещания.

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