Dialogflow V1 Node.js Webhook异步调用后语音无法即时返回问题
嘿,我来帮你排查这个异步调用后语音无法及时返回的问题!
问题根源分析
你的代码里有两个关键问题导致了这个现象:
this指向错误:在.then()和.catch()的普通回调函数里,this的上下文已经不是spotifyIntent函数本身了,所以this.app实际上是undefined,根本没法触发ask()方法返回语音。- Promise链冗余处理:你手动
return Promise.resolve()完全没必要,.then()和.catch()本身就会返回Promise,Dialogflow会自动等待这个Promise完成。
修正方案1:用箭头函数解决上下文问题
箭头函数会继承外部函数的this上下文,或者你可以直接使用spotifyIntent参数里的app变量(更简单):
const {DialogflowApp} = require('actions-on-google'); function spotifyIntent(app) { // 获取搜索参数 [...] return asyncFunction(query) .then(message => { // 直接用外部的app变量,不用this app.ask(message); }) .catch(err => { app.ask(`Une erreur est apparue: ${err}`); }); }
修正方案2:用async/await简化异步逻辑
如果你的asyncFunction本身是异步函数,更推荐用async/await写法,代码更直观,还能彻底避免this的坑:
const {DialogflowApp} = require('actions-on-google'); async function spotifyIntent(app) { // 获取搜索参数 [...] try { const message = await asyncFunction(query); app.ask(message); } catch (err) { app.ask(`Une erreur est apparue: ${err}`); } }
为什么这样能解决问题?
不管用哪种方案,核心都是确保在异步操作完成后,能正确调用app.ask()方法。箭头函数或async/await帮你维持了正确的上下文,让Dialogflow能在异步任务结束后立即收到响应指令,自然就能及时返回语音了。
内容的提问来源于stack exchange,提问作者Rémi C.
相关产品推荐
相关产品推荐

