我在then
语句中调用一个函数,该函数必须等待事件触发,但我的初始函数几乎立即返回undefined
:
// call.js
const dialogflow = require('./dialogflow')
module.exports = {
receive: functions.https.onRequest((request, response) => {
...
let respondToUser = getUserId
.then((uid) => {
payload.uid = uid
dialogflow.handleIncoming(payload).then((result) => {
console.log(result)
})
})
.then((result) => {
console.log(result)
response.end()
})
...
}
}
// dialogflow.js
module.exports = {
handleIncoming: (payload) => {
...
let df = dialogflow.textRequest(message.message, {
sessionId: payload.from
})
.on('response', (response) => {
return response.result.fulfillment.speech
})
.on('error', (error) => {
return 'That\'s an error on my end. Try again later!'
})
.end()
}
}
目标是从dialogflow.handleIncoming(payload)
调用call.js
,等待它返回一些文字,然后继续。但无论我如何构建它,receive
只是不断吹过它,dialogflow.handleIncoming(payload)
结束undefined
。
我尝试在df
上使用承诺但没有成功,我无法弄清楚如何让respondToUser
等待来自handleIncoming
的完整回复。其他一切都在运作,所以我只包含相关的代码。
这是使用api.ai(dialogflow),但在Firebase中的云功能中有帮助。感谢任何帮助!
答案 0 :(得分:1)
问题是dialogflow.handleIncoming(payload)
不是为异步而构建的。试试这个:
// dialogflow.js
exports.handleIncoming = (payload) =>
new Promise((resolve, reject) => {
...
let df = dialogflow.textRequest(message.message, {
sessionId: payload.from
})
.on('response', (response) => {
resolve(response.result.fulfillment.speech)
})
.on('error', (error) => {
reject ('That\'s an error on my end. Try again later!')
})
.end()
}
答案 1 :(得分:0)
您的接收功能不等待thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: "SendError(..)"', src/libcore/result.rs:860
note: Run with `RUST_BACKTRACE=1` for a backtrace.
完成。包含它的dialogflow.handleIncoming(payload)
函数没有return语句,因此它返回then
而不是返回undefined
的结果(这是你想要的)。
dialogflow.handleIncoming
下一个let respondToUser = getUserId
.then((uid) => {
payload.uid = uid
return dialogflow.handleIncoming(payload)
})
.then((result) => {
console.log(result)
response.end()
})
语句将包含then
的回复。