Как обработать асинхронное обновление токена с помощью вложенного запроса? - PullRequest
0 голосов
/ 29 апреля 2018

Я делаю запрос POST в запросе POST. Второй POST использует token из первого POST запроса.

Я не знаю, когда закончится 2nd POST, но я уверен, что он продлится дольше, чем срок действия token, давайте предположим, что он равен 10 seconds.

Теперь моя проблема в том, как мне с этим справиться. Я имею в виду, как мне обновить токен, зная, что он используется в 2nd POST.

Вот мой код:

var request = require('request');
var async   = require('async');
var fs      = require('fs');
var renew_token_timer ;



var o = {
    "someValue": "s",
    "someValue2": "g"
};
var s = JSON.stringify(o);

request({
    headers: {
      'Content-Type': 'application/json'
    },
    uri: '/getToken',
    body: s,
    method: 'POST'
}, function (err, res, body) {

    var renew_token = setInterval(function(){
      console.log("renew token now after 10sec");
    },10000);

    var token = JSON.parse(body);
    var tasks = [];
    for(let i = 1; i < 10 ; i++){
        tasks.push(function(callback){
            getPeople(25, i, token, callback);
        });
    }
    async.series(tasks,
    function(err, results) {
        console.log("FINISHED");
    });

  });

  function getContacts(pageSize, page, access_token, callback){
    var to_send = {"test" : "test"};

   var to_send = JSON.stringify(to_send);
   var url = "/getPeople";
   request({
    headers: {
        'Content-Type': 'application/json',
        'Authorization': 'Bearer ' + token,
    },
     time : true,
     uri: url,
     body: to_send,
     method: 'POST'
    }, function (err, res, body) {
        callback();
   });
  }

Любой совет, пожалуйста?

1 Ответ

0 голосов
/ 29 апреля 2018

Чтобы упростить это, давайте выделим вызовы в многообещающие функции:

  function retrieveToken() {
   return new Promise((res, rej) => {
    request({
     headers: { 'Content-Type': 'application/json'  },
     uri: '/getToken',
     body: JSON.stringify({ "someValue": "s",  "someValue2": "g" }),
     method: 'POST'
    }, (err, _, body) => err ? rej(err) : res(JSON.parse(body)));
  });
 }

 const retrieveContacts = (size, page, token) => new Promise(res => getContacts(size, page, token, res));

Теперь все довольно просто:

 (async function() {
   // Get the first token to start:
   let token = await retrieveToken();
   // Update the token sometimes:
   setInterval(async () => token = await retrieveToken(), 8000);
   // Retrieve the data
   for(let i = 1, i < 10; i++)
     await retrieveContacts(25, i, token);
 })();

Это просто обновляет переменную токена каждые 10 секунд, чтобы указывать на новый токен. Это должно работать в большинстве случаев.


Теперь, если получение токена занимает больше времени, чем предполагалось, может случиться, что запросы получат устаревший токен. Чтобы предотвратить это, просто поработайте с токеном Promise и дождитесь его, прежде чем делать запрос:

 (async function() {
   // Get the first token to start:
   let tokenPromise = retrieveToken();
   // Update the token sometimes:
   setInterval(() => tokenPromise = retrieveToken(), 10000);
   // Retrieve the data
   for(let i = 1, i < 10; i++)
     await retrieveContacts(25, i, await tokenPromise);
 })();

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

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