#javascript #node.js #async-await #hapi
#javascript #node.js #async-ожидание #hapi
Вопрос:
Я работаю над расширением Twitch, если кто-нибудь знаком, и начал отрабатывать один из их примеров. Я довольно новичок в JS, в основном знаком с C #, поэтому многое из этого для меня немного чуждо. В принципе, я настроил маршрут hapi и хочу, чтобы мой сервер узла выполнял вызов API для другой службы и возвращал строку, которая включает некоторые данные из ответа API, которые затем вставляются в iFrame с использованием AJAX-запроса. Оболочка API, которую я использую, использует асинхронные функции, и когда я вызываю их внутри обработчика маршрута, время ожидания запросов истекает, насколько я могу судить, просматривая запрос в devtools chrome. Не уверен, что вызовы API просто занимают слишком много времени или что-то в этом роде? Вот ссылка на оболочку API, которую я использую: https://www.npmjs.com/package/smashgg.js?activeTab=readme
Я подозреваю, что мне чего-то не хватает в синтаксисе async / await, я пока не совсем понимаю, как они работают. В идеале я хотел бы иметь код, который возвращает выходную строку в своем собственном методе, но для простоты я просто скопировал пример, но я получаю те же результаты. Этот код отлично выполняется в своем собственном файле.
Вот определение маршрута:
server.route({
method: 'GET',
path: '/bracket/query',
handler: bracketQueryHandler
});
и метод обработчика маршрута:
async function bracketQueryHandler(req){
const payload = verifyAndDecode(req.headers.authorization);
const { channel_id: channelId, opaque_user_id: opaqueUserId } = payload;
const currentBracket = channelBrackets[channelId] || initialBracket;
let tournamentSlug = 'function-1-recursion-regional';
let eventSlug = 'melee-singles';
let meleeAtFunction = await Event.get(tournamentSlug, eventSlug);
let sets = await meleeAtFunction.getSets();
let phaseGroups = await meleeAtFunction.getPhaseGroups();
let setString = "";
for(var i in sets){
setString = "n" sets[i].getFullRoundText() " : " sets[i].getDisplayScore();
}
console.log(setString);
return setString;
}
Ответ №1:
Вам нужно дождаться разрешения результата асинхронной функции bracketQueryHandler. Это должно быть так же просто, как добавление await в ваш обработчик маршрута.
server.route({
method: 'GET',
path: '/bracket/query',
handler: await bracketQueryHandler
});
При этом я обычно использовал бы конструкцию, подобную..
server.route({
method: 'GET',
path: '/bracket/query',
handler: async (request, h) => {
return await bracketQueryHandler(request)
}
});
Эта конструкция согласуется с документами. https://hapijs.com/tutorials#routes
Некоторое чтение в async / await https://medium.freecodecamp.org/how-to-master-async-await-with-this-real-world-example-19107e7558ad
Знакомство с этим синтаксисом и обещанием совершенно необходимо при использовании Hapi 17 и выше.
Комментарии:
1.
handler: await bracketQueryHandler
будет ожидать функцию один раз (не вызовы функции) и бесполезен.