Javascript 如何在Google上使用异步实现操作
我正在尝试创建一个非常简单的语音应用程序,通过使用谷歌对话操作来查询汇率 我用吃角子老虎机进出货币。然后我尝试调用一个web钩子,该钩子反过来调用一个API来获取两种货币之间的汇率 首先,我尝试使用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
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功能之间的集成出了问题。你应该看看计划,确保你在正确的层次上