【问题标题】:Encapsulating API.ai call into an external javascript function is not working将 API.ai 调用封装到外部 javascript 函数中不起作用
【发布时间】:2017-03-22 17:16:03
【问题描述】:

这段代码运行良好:

var apiai = require('apiai');
var app = apiai(<token>);

var request = app.textRequest('jacket', {
  'sessionId': 123456
});

request.on('response', function(response) {
  console.log(response);
  console.log(response.result.fulfillment.speech);
  console.log(response.result.metadata.intentName);
});

request.on('error', function(error) {
  console.log(error);
});

request.end();

它会产生以下控制台输出:

{ id: '2865abde-ac8f-4ac3-816e-483c68f709d0',
  timestamp: '2016-11-08T22:38:56.461Z',
  result:
   { source: 'agent',
     resolvedQuery: 'jacket',
     action: '',
     actionIncomplete: false,
     parameters: {},
     contexts: [ [Object] ],
     metadata:
      { intentId: '357af94f-00b3-4016-a661-732419ddafd6',
        webhookUsed: 'false',
        intentName: 'clothing' },
     fulfillment: { speech: 'clothing2', messages: [Object] },
     score: 0.6 },
  status: { code: 200, errorType: 'success' },
  sessionId: '123456' }
clothing2
clothing

但是,当我尝试将其分解为函数调用时,事情就不那么好了:

文件:main.js

 var apiai = require('apiai');
 var app3 = apiai(<token>);

exports.getresponse = function(inputstring){
  var request = app3.textRequest(inputstring, {'sessionId': 123456});
  request.on('response', function(response) {
    return(response);
});
  request.on('error', function(error) {
    return(error);
});
  request.end();
};

文件:moda.js

var express = require("express");
var app = express();
var joe = require('./main.js');
console.log(joe.getresponse('jacket'));
app.listen(3000);

当我运行 moda.js(节点 moda.js)时,我只得到

undefined

作为控制台输出。

我在这里做错了什么?

非常感谢!

【问题讨论】:

标签: javascript node.js api-design dialogflow-es


【解决方案1】:

joe.getresponse() 没有显式返回,因此它具有隐式 return undefined;

这就是您在控制台输出中看到undefined 的原因。

原因有点复杂,是 javascript 编程的基础,但它与回调和 javascript 的异步执行有关。

在这里,您实际上是在添加一个匿名函数作为回调。该函数在被调用(通常是为了响应事件)之前实际上并没有被执行。

  request.on('response', function(response) {
    return(response);
});

因此,当您返回响应时,该返回的范围不在 getresponse() 外部函数内,而是在 response 事件发射器内。

相反,您需要以可以确定性访问它的方式捕获响应值。通过向getresponse() 方法提供您自己的回调,该回调将有权访问响应对象。

它看起来像这样:

ma​​in.js

var apiai = require('apiai');
var app3 = apiai(<token>);

exports.getresponse = function(inputstring,callback){
  var request = app3.textRequest(inputstring, {'sessionId': 123456});
  request.on('response', function(response) {
    callback(null,response);
});
  request.on('error', function(error) {
    callback(error,null);
});
  request.end();
};

moda.js

var express = require("express");
var app = express();
var joe = require('./main.js');
joe.getresponse('jacket', function(error,response) {
     if(error) { console.error(error); }
     console.log(response);
 });
app.listen(3000);

我不是返回响应值,而是调用调用者提供的回调,然后处理响应(调用 console.log)。

【讨论】:

  • 当我运行这个时,我得到一个引用 onResponse 的错误。如果我没看错,函数 onResponse 需要在某个地方定义,对吗?这是您所指的调用者提供的回调吗?
  • NP。你了解根本问题吗?它是使用 JavaScript 的基础吗?
  • 好吧,有点。在过去一天左右的时间里,我一直在尝试围绕异步执行进行思考。它把我的大部分编程专业知识都彻底颠覆了,所以在这一点上对我来说真的不直观。我似乎无法弄清楚如何有效地来回传递变量。似乎所有东西都必须嵌套。这不适合简单的代码(又名回调地狱)。如果您有一些资源可以帮助将顺序编码器转换为异步,那将非常有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-08
  • 2010-12-03
相关资源
最近更新 更多