Javascript 带承诺导出函数,等待响应
我在Javascript 带承诺导出函数,等待响应,javascript,node.js,google-cloud-functions,dialogflow-es,Javascript,Node.js,Google Cloud Functions,Dialogflow Es,我在then语句中调用一个函数,该函数必须等待事件触发,但我的初始函数几乎立即返回undefined: // call.js const dialogflow = require('./dialogflow') module.exports = { receive: functions.https.onRequest((request, response) => { ... let respondToUser = getUserId .then((uid)
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()
}
}
目标是从call.js
调用dialogflow.handleIncoming(有效负载)
,等待它返回一些文本,然后继续。但无论我如何构造它,receive
只是不断地在它中穿行,然后对话流。handleIncoming(有效负载)
最终是未定义的
我尝试在df
上使用承诺,但没有成功,我不知道如何让respondouser
等待handleIncoming
的完整响应。其他一切都在工作,所以我只包括相关的代码
这是使用api.ai(dialogflow),但如果有帮助的话,可以使用Firebase中的云函数。谢谢你的帮助 您的接收函数没有等待
对话框flow.handleIncoming(有效负载)
完成。包含它的then
函数没有return语句,因此它返回undefined
,而不是返回dialogflow.handleIncoming的结果(这是您想要的)
下一个then
语句将包含来自diagflow的响应。handleIncoming
问题是对话框流。handleIncoming(有效负载)
不是为异步而构造的。试试这个:
// 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()
}
这让我走上了正确的道路。谢谢我必须设置handleIncoming以返回新承诺,然后返回dialogflow.handleIncoming()。除非那是错的?
// 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()
}