Чтобы упростить это, давайте выделим вызовы в многообещающие функции:
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);
})();
Это будет ожидать поступления нового токена, прежде чем отправлять другой запрос после того, как предыдущий токен устарел.