带有承诺的导出功能,等待回复

时间:2017-10-28 22:55:18

标签: javascript node.js google-cloud-functions dialogflow

我在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中的云功能中有帮助。感谢任何帮助!

2 个答案:

答案 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的回复。