javascript中的方法承诺不会在dialogflow上运行
这是dialogflow v2中使用的yelp fusion node.js API的代码 问题:javascript中的方法承诺不会在dialogflow上运行,javascript,node.js,dialogflow-es,yelp,yelp-fusion-api,Javascript,Node.js,Dialogflow Es,Yelp,Yelp Fusion Api,这是dialogflow v2中使用的yelp fusion node.js API的代码 问题: agent.add(response.jsonBody.businesss[0].name)这应该让机器人说,即使代码在那里,企业的名称实际上也没有运行 从研究中,其他答案提到了在这个javascript承诺中使用胖箭头=>的必要性 然而,它已经被使用。.then()中的代码没有运行,除了console.log,它确实在运行 有谁能给我一些建议,告诉我如何在javascript中运行方法吗? 还是
agent.add(response.jsonBody.businesss[0].name)代码>这应该让机器人说,即使代码在那里,企业的名称实际上也没有运行
从研究中,其他答案提到了在这个javascript承诺中使用胖箭头=>的必要性
然而,它已经被使用。.then()中的代码没有运行,除了console.log,它确实在运行
有谁能给我一些建议,告诉我如何在javascript中运行方法吗?
还是其他选择?
非常感谢。谢谢
下面的客户端是YelpAPI客户端
代理是dialogflow中的webhookclient。在下面的代码之外执行时,agent.add()可以工作
client.search({
term:'Four Barrel Coffee',
location: 'san francisco, ca'
}).then(response => {
//res = response.jsonBody.businesses[0].name; //*not assigned!
console.log(response.jsonBody.businesses[0].name);
agent.add(response.jsonBody.businesses[0].name); //*nothing!
}).catch(e => {
console.log(e);
});
你有一半的答案。使用胖箭头并不重要,重要的是处理异步函数(客户机.search
调用),并且在dialogflow实现库中使用异步函数时,需要使用承诺
具体来说,您需要返回一个承诺,以便调用函数知道它必须等待所有then()
子句完成才能发送回复
您不会显示整个函数,但可以通过添加一些return
语句来实现。可能是这样的:
return client.search({
term:'Four Barrel Coffee',
location: 'san francisco, ca'
}).then(response => {
return agent.add(response.jsonBody.businesses[0].name);
}).catch(e => {
console.log(e);
return Promise.reject( e );
});
什么是agent.add?它是异步的吗?你能发布一些上下文吗?@AritraChakraborty添加了关于什么是代理的更多信息-agent.add是dialogflow中的一个方法,它要求机器人说些什么。当在上述代码之外运行时,它可以工作。因此,被注释掉的
console.log(response.jsonBody.businesss[0].name)
实际执行(当它未被注释时)?它在控制台上记录了什么?确保它没有记录稍后填充的对象。请尝试console.log(`Name:${response.jsonBody.businesss[0].Name}`)
或者尝试其他SDK,例如官方Yelp Fusion repo链接的SDK~@Phil感谢您的建议。行!我认为这不是问题所在。OP的问题中没有任何内容表明他们依赖于client.search()
调用的返回值。我不知道你为什么这么说@Phil。OP有一个then()
块,用于获取响应中的client.search()
的结果。它们在调用agent.add()
时使用response
。他们说console.log()
有效,这表明agent.add()
无效agent.add()
是Dialogflow库的一部分,将结果返回给用户,但如果涉及异步函数,则依赖于返回的承诺。我不知道client.search()
函数,但它看起来确实是异步的。没有证据表明OP的示例代码中返回了承诺。但是,agent.add()
在调用时不会执行吗?如果其返回值在外部承诺中返回/解析与否有什么区别?我不熟悉DialogFlow,所以很高兴看到我的假设可能是错误的,但不幸的是,事实并非如此。如果已将响应发送给用户(如果函数退出而不返回承诺,则会执行此操作),则您将add()
ing发送给已发送的消息。这就像在整个响应已发送给用户且连接已关闭后尝试发送HTTP响应。(事实上……不是那样的……就是那样。)太棒了!谢谢你提供的额外信息。希望这能解决OP的问题