Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.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 如何在BotKit中存储和访问来自外部API请求的对话变量? 总结_Javascript_Rest_Botkit - Fatal编程技术网

Javascript 如何在BotKit中存储和访问来自外部API请求的对话变量? 总结

Javascript 如何在BotKit中存储和访问来自外部API请求的对话变量? 总结,javascript,rest,botkit,Javascript,Rest,Botkit,我正在使用BotkitConversation API用BotKit制作一个网络应用聊天机器人。我想使用来自用户的输入查询一个外部API,然后将一些结果数据返回给用户。 我可以使用{{vars.key}}模板将用户的输入作为变量存储在对话框对象上,并且可以从API访问JSON响应并显示在控制台中,但不能显示在聊天窗口中 我试过的 我试图使用conva.setVar来存储一些JSON数据。我知道API调用起作用了,因为我还将console.log记录为相同的值,这与预期的一样 一些代码 注意:ap

我正在使用BotkitConversation API用BotKit制作一个网络应用聊天机器人。我想使用来自用户的输入查询一个外部API,然后将一些结果数据返回给用户。 我可以使用{{vars.key}}模板将用户的输入作为变量存储在对话框对象上,并且可以从API访问JSON响应并显示在控制台中,但不能显示在聊天窗口中

我试过的 我试图使用conva.setVar来存储一些JSON数据。我知道API调用起作用了,因为我还将console.log记录为相同的值,这与预期的一样

一些代码 注意:api_键和端点等内容存储在其他地方,这只是一个摘录

/*“查询”对话框*/ 让DIALOG_ID='my_DIALOG_1'; 让query\u dialog=new BotkitConversationDIALOG\u ID,控制器; 设total=0; 查询对话框。询问“您想用什么搜索词搜索?”,asyncqueryTerm,查询对话框,bot=>{ query_dialog.setVar'queryTerm',queryTerm; log`user query is${queryTerm}.`; log`fetching results from:${endpoint}?api_key=${api_key}&q=${queryTerm}`; 获取`${endpoint}?api_key=${api_key}&q=${queryTerm}` .thenresponse=>response.json .thenjson=>{ query_dialog.setVar'total',json.total; console.log`~~结果总数:${json.total}~`;//这显示:2 //假设有{{vars.total}}个结果`;//这个永远不会被调用 //bot.say'weres${total}results`;//这永远不会被调用 total=json.total; } //.thenjson=>console.log`~~结果总数:${json.total}~~`//这显示:2 //.thenjson=>query\u dialog.setVar'total',json.total=>bot.say`have{{vars.total}}results`//这不会运行 .catcherror=>console.logerror }"queryTerm",; 查询对话框。假设“用户查询为{{vars.queryTerm}”。`;//这是意料之中的事 查询对话框。假设“有{{vars.total}}个结果”;//显示结果 //查询对话框。说“有${total}个结果”;//表示有0个结果,这是不正确的,只从“let total”开始的内容中提取 controller.addDialogquery_对话框; /*结束对话框*/ /*触发对话框*/ controller.hears'query',message',asyncbot,message=>{ 等待bot.beginDialogDIALOG_ID; }; 期望与现实 正如预期的那样,在聊天窗口中,用户的查询被重复返回给他们:用户查询是{your_query}。
但是,下一行显示的是结果,这意味着vars.total中没有存储任何内容。实际输出应该是一个数字。

这里的问题是fetch调用返回一个承诺,异步处理函数立即解决,而不是等待fetch返回结果并将其设置到对话框内存空间中

解决此问题的最简单方法是返回一个承诺,以便您可以控制它何时解决:

return new Promise(function(resolve, reject) { 

 /// do fetch here
 fetch.then().then().then(resolve)

});