使用 promise 导出函数,等待响应

Export function with promise, wait for response

我在 then 语句中调用函数,该函数必须等待事件触发,但我的初始函数几乎立即 returning 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(payload),等待它 return 一些文本,然后继续。但无论我如何构建它,receive 都会一直吹过它,dialogflow.handleIncoming(payload) 最终会变成 undefined.

我试过在 df 上使用 promise 但没有成功,我不知道如何让 respondToUser 等待 handleIncoming 的完整响应。其他一切正常,所以我只包含相关代码。

这是使用 api.ai(对话流),但如果有帮助,则在 Firebase 的云函数中。感谢任何帮助!

您的接收函数没有等待 dialogflow.handleIncoming(payload) 完成。包含它的 then 函数没有 return 语句,因此它是 returning undefined 而不是 returning [=14= 的结果](这就是你想要的)。

let respondToUser = getUserId
      .then((uid) => {
        payload.uid = uid
        return dialogflow.handleIncoming(payload)
      })
      .then((result) => {
        console.log(result)
        response.end()
      })

下一个 then 语句将包含来自 diagflow.handleIncoming 的响应。

问题是 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()
  }