Javascript 如何在Google上使用异步实现操作

Javascript 如何在Google上使用异步实现操作,javascript,node.js,asynchronous,actions-on-google,Javascript,Node.js,Asynchronous,Actions On Google,我正在尝试创建一个非常简单的语音应用程序,通过使用谷歌对话操作来查询汇率 我用吃角子老虎机进出货币。然后我尝试调用一个web钩子,该钩子反过来调用一个API来获取两种货币之间的汇率 首先,我尝试使用wait request将履行函数定义为async,然后尝试return wait request,但无法让履行函数等待GET请求返回。然后我使用承诺尝试了下面的代码,现在它超时了。我不知道如何解决这个问题 const{conversation}=require('@assistant/convers

我正在尝试创建一个非常简单的语音应用程序,通过使用谷歌对话操作来查询汇率

我用吃角子老虎机进出货币。然后我尝试调用一个web钩子,该钩子反过来调用一个API来获取两种货币之间的汇率

首先,我尝试使用
wait request
将履行函数定义为
async
,然后尝试
return wait request
,但无法让履行函数等待
GET
请求返回。然后我使用
承诺尝试了下面的代码,现在它超时了。我不知道如何解决这个问题

const{conversation}=require('@assistant/conversation');
const functions=require('firebase-functions');
const request=require('request');
const app=conversation();
app.handle('get\u exchange\u rate',conv=>{
conv.session.params.rate=0;
将fromCcy=“EUR”//conv.session.params.currency从\u槽中取出;
让toCcy=“GBP”//conv.session.params.currency_到_插槽;
让url=`https://api.exchangeratesapi.io/latest?base=${fromCcy}&symbols=${toCcy}`;
让选项={
json:true
};
返回新承诺((解决、拒绝)=>{
请求(url、选项、(错误、分辨率、正文)=>{
如果(错误){
console.log(错误);
拒绝(错误);
}否则如果(res.statusCode==200){
控制台日志(主体);
conv.session.params.rate=body.rates[toCcy];
解决();
}
});
});
});
exports.ActionsOnGoogleFulfillment=functions.https.onRequest(应用程序);
注意:到目前为止,我在文档中找到的所有示例都是用于琐碎的同步工作,比如返回静态消息。我还没有找到任何例子来说明如何使用异步工作来实现这一点

更新:我是从位于操作控制台>Webhooks的Google对话操作控制台,并使用内联云函数履行类型来执行此操作的

超时问题不知怎么地消失了——实际上是一夜之间——我突然能够在对话提示中以
$session.params.rate
的形式处理响应


从Google Actions控制台到Firebase的变更传播似乎有些问题。我还注意到,从开发选项卡切换到测试需要花费大量的时间来加载。有这样一条消息,
您的预览正在更新…
带有一个微调器,有时只需要永远。有时它只是超时,并要求我的版本,我想再次预览。然后我再试一次,它立刻就完成了。还不是很好的DX。

我使用async/await遇到了与您非常相似的问题

我注释掉了所有异步的东西,然后逐渐地一次一个地把它们都带回来,最后它开始工作了。。。耸耸肩

我正在处理程序中使用节点获取

const fetch = require('node-fetch');
/* plus your other regular includes */

app.handle('checkCurrentPrice', async conv => {

    const url = 'https://api....';

    let body = {"key" : "var"};
  
    const externalRes = await fetch(url, {
        method: 'POST',
        body: JSON.stringify(body),
        headers: {"Content-Type" : "application/json"},
    });
  
    const json = await externalRes.json();
});

exports.ActionsOnGoogleFulfillment = functions.https.onRequest(app);


我使用async/await遇到了与您非常相似的问题

我注释掉了所有异步的东西,然后逐渐地一次一个地把它们都带回来,最后它开始工作了。。。耸耸肩

我正在处理程序中使用节点获取

const fetch = require('node-fetch');
/* plus your other regular includes */

app.handle('checkCurrentPrice', async conv => {

    const url = 'https://api....';

    let body = {"key" : "var"};
  
    const externalRes = await fetch(url, {
        method: 'POST',
        body: JSON.stringify(body),
        headers: {"Content-Type" : "application/json"},
    });
  
    const json = await externalRes.json();
});

exports.ActionsOnGoogleFulfillment = functions.https.onRequest(app);


我认为从app.handle()处理程序函数返回承诺是正确的。你说当你尝试它时,请求超时。。。我会在你的帖子中详细阐述这一点,并对这一领域进行更多调查。你确定你的URL返回正确吗?如果您使用的是Firebase函数,您可能需要升级您的项目以发出外部URL请求。@NickFelker是的,我使用的是云函数,但来自操作控制台内联编辑器。我不确定你通过“升级”得到了什么,但如果你指的是账单账户,我已经链接了一个账单账户。我已经用细节更新了问题,以便更具体地说明履行情况。然而,考虑到它确实工作了一段时间,看起来并不是代码出了问题,而是操作控制台和Firebase功能之间的集成出了问题。你应该看看计划,确保自己的想法是正确的。tierI认为你从应用程序返回承诺的路线是正确的。handle()处理函数。你说当你尝试它时,请求超时。。。我会在你的帖子中详细阐述这一点,并对这一领域进行更多调查。你确定你的URL返回正确吗?如果您使用的是Firebase函数,您可能需要升级您的项目以发出外部URL请求。@NickFelker是的,我使用的是云函数,但来自操作控制台内联编辑器。我不确定你通过“升级”得到了什么,但如果你指的是账单账户,我已经链接了一个账单账户。我已经用细节更新了问题,以便更具体地说明履行情况。然而,考虑到它确实工作了一段时间,看起来并不是代码出了问题,而是操作控制台和Firebase功能之间的集成出了问题。你应该看看计划,确保你在正确的层次上