Каков отраслевой стандарт для ожидания вызова функции, вложенной в другую функцию await? - PullRequest
0 голосов
/ 26 декабря 2018

У меня есть функция в node.js, которая ждет HTTP GET-запроса, прежде чем продолжить.В обработчике ошибок для этого запроса GET мне нужно вызвать другую функцию и также дождаться ее.

Моя интуиция говорит, что я должен поставить "await" перед вторым вызовом функции.Тем не менее, node.js не допустит этого.Насколько я понимаю, это потому, что область обработчика ошибок больше не помечается как асинхронная.Я могу обойти это, однако он очень быстро получает спагетти .

Какое лучшее решение?

var accessToken = "SAMPLE ACCESS TOKEN";

const stockDataRequest = async (symbol) =>
{
    console.log("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.log("\n----Axios Request Failed As Planned----\n");

        if(error.response.status == 401)
        {
            accessToken = auth.newAccessToken(); //**WE NEED TO WAIT ON THIS!!!!**
        }
    });

    console.log("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.log("rejecting");
                reject("\n\n----New Access Token Request Rejected----\n\n", error);
            }
            else
            {
                console.log("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.

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

1 Ответ

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

Я думаю, что вы упускаете точку с помощью async / await и смешиваете ее с Promises.Вот как ваш код может выглядеть с помощью 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
    }
  }
}
...