如何在JOVO的Intent中运行异步函数以获取正确响应?
解决Jovo Intent中异步函数调用的问题
这问题我之前也碰到过,核心就是没正确处理异步函数的执行时机~你现在的代码同步调用异步方法FindItem,但异步函数会立刻返回一个Promise,不会直接等到结果出来,所以你的this.ask(response)会在FindItem还没完成查询时就执行,这时候response还是初始的'nada'。
要搞定这个很简单,只需要调整两步:把Intent处理函数改成异步函数,用await等待异步操作完成,具体如下:
步骤1:给Intent函数加上async关键字
只有标记为async的函数内部,才能使用await来等待异步结果,所以先把Intent方法改成异步函数。
步骤2:用await调用FindItem
把同步调用改成await FindItem(...),这样代码会暂停在这里,直到FindItem的异步操作完成并返回结果,再赋值给response。
修改后的完整代码
app.setHandler({ async Intent() { // 这里添加async关键字 let response = 'nada'; response = await FindItem(this.$inputs.Item.value); // 这里添加await this.ask(response); } });
额外要确认的点
- 确保
FindItem确实是返回Promise的异步函数:比如它本身是用async定义的,或者内部通过new Promise()封装了异步逻辑(比如数据库查询、API请求)。举个FindItem的示例写法:async function FindItem(itemValue) { // 模拟异步操作,比如调用外部接口或查询数据库 await new Promise(resolve => setTimeout(resolve, 100)); return 'Banana'; // 实际场景中这里是异步获取到的真实结果 } - Jovo框架完全支持异步的handler函数,只要你的Node.js环境支持ES6+的async/await(现在主流版本都没问题)。
这样修改后,Intent就会等FindItem拿到结果后再返回正确响应,不会再提前返回'nada'啦~
内容的提问来源于stack exchange,提问作者Richard Sun
相关产品推荐
相关产品推荐

