Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 带承诺导出函数,等待响应_Javascript_Node.js_Google Cloud Functions_Dialogflow Es - Fatal编程技术网

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()
  }