У меня есть функция в node.js, которая ожидает HTTP-запроса GET, прежде чем продолжить. В обработчике ошибок для этого запроса GET мне нужно вызвать другую функцию и тоже дождаться ее.
Моя интуиция подсказывает, что перед вызовом второй функции я должен поставить «await». Однако node.js этого не допустит. Насколько я понимаю, это связано с тем, что область обработчика ошибок больше не помечена как асинхронная. Я могу обойти это, но он очень быстро получает спагетти.
Какое лучшее решение?
var accessToken = "SAMPLE ACCESS TOKEN";
const stockDataRequest = async (symbol) =>
{
console.info("Old access token:", accessToken);
//Request stock data.
await axios.get(`https://api.tdameritrade.com/v1/marketdata/${symbol}/quotes?authorization=${accessToken}`).then((response) =>
{
//unimportant
})
.catch((error) =>
{
console.info("\n----Axios Request Failed As Planned----\n");
if (error.response.status == 401)
{
accessToken = auth.newAccessToken(); //**WE NEED TO WAIT ON THIS!!!!**
}
});
console.info("New access token:", accessToken, "\n");
}
В авторизации:
var newAccessToken = () =>
{
var dataString = 'grant_type=refresh_token&refresh_token=' + refToken + '&access_type=&code=&client_id=GASKETGV2&redirect_uri=';
request(
{
url: 'https://api.tdameritrade.com/v1/oauth2/token',
method: 'POST',
headers: headers,
body: dataString
},
(error, response, body) =>
{
return new Promise((resolve, reject) =>
{
if (error || response.statusCode != 200)
{
console.info("rejecting");
reject("\n\n----New Access Token Request Rejected----\n\n", error);
}
else
{
console.info("Request for new access token resolved. Now returning from auth.");
var genToken = "Bearer " + JSON.parse(body).access_token;
resolve(genToken);
}
})
});
};
Вот результаты:
Old access token: SAMPLE ACCESS TOKEN
----Axios Request Failed As Planned----
New access token: undefined
Request for new access token resolved. Now returning from auth.
Последние два оператора следует поменять местами и определить новый токен.
newAccessToken() нужен для return в request().





Я думаю, вы упускаете суть с async / await и смешиваете его с обещаниями. Вот как ваш код может выглядеть с async / await:
var accessToken = "SAMPLE ACCESS TOKEN";
const stockDataRequest = async (symbol) =>
{
try {
const response = await axios.get(`https://api.tdameritrade.com/v1/marketdata/${symbol}/quotes?authorization=${accessToken}`);
// do stuff with response
} catch (error) {
if (error.response.status == 401) {
const newAccessToken = await auth.newAccessToken();
// do stuff with new accesstoken
}
}
}
Прогресс был достигнут, я полностью отреагировал, чтобы вообще избежать обещаний. Однако порядок вывода не изменился, независимо от спецификации ожидания.
Решение найдено! «Вернуть новое обещание» нужно было включить request (), а все обещания в асинхронной функции нужно было удалить. Большое спасибо и счастливого Рождества.
Боковое примечание: когда я нажимаю "await" перед второй функцией, я получаю следующее: "SyntaxError: await допустимо только в асинхронной функции"