Каков отраслевой стандарт ожидания вызова функции, вложенного в другую функцию ожидания?

У меня есть функция в 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.

Последние два оператора следует поменять местами и определить новый токен.

Боковое примечание: когда я нажимаю "await" перед второй функцией, я получаю следующее: "SyntaxError: await допустимо только в асинхронной функции"

user4643312 26.12.2018 06:34
newAccessToken() нужен для return в request().
Patrick Roberts 26.12.2018 06:48
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, вы упускаете суть с 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
    }
  }
}

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

user4643312 26.12.2018 07:01

Решение найдено! «Вернуть новое обещание» нужно было включить request (), а все обещания в асинхронной функции нужно было удалить. Большое спасибо и счастливого Рождества.

user4643312 26.12.2018 07:07

Другие вопросы по теме