如果有人熟悉的话,我正在开发Twitch扩展程序,并从他们的示例之一开始工作。我对JS相当陌生,主要是C#背景,因此对我来说很多都是陌生的。基本上,我已经设置了一个hapi路由,希望我的节点服务器对不同的服务进行API调用,并返回一个包含来自API响应的某些数据的字符串,然后使用AJAX请求将其插入到iFrame中。我正在使用的API包装器使用了异步函数,当我在路由处理程序中调用它们时,请求似乎超时了,这与我在chrome devtools中查看请求所得出的结论不符。不确定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;
}
答案 0 :(得分:0)
您需要等待异步函数bracketQueryHandler的结果解决。这就像在路由处理程序中添加一个等待一样简单。
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
一些关于异步阅读的信息/等待https://medium.freecodecamp.org/how-to-master-async-await-with-this-real-world-example-19107e7558ad
使用Hapi 17及更高版本非常有必要熟悉此语法和Promise。