Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/469.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中的方法承诺不会在dialogflow上运行_Javascript_Node.js_Dialogflow Es_Yelp_Yelp Fusion Api - Fatal编程技术网

javascript中的方法承诺不会在dialogflow上运行

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中运行方法吗? 还是

这是dialogflow v2中使用的yelp fusion node.js API的代码

问题:
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的问题