2016-11-08 8 views
0

Этот код работает отлично:Инкапсуляция API.ai называют в внешний Javascript функция не работает

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 

как выход консоли.

Что я здесь делаю неправильно?

Большое спасибо!

+0

Вы публично выставили токен api.ai в этом посте. Вы ДОЛЖНЫ немедленно восстановить этот токен. https: //docs.api.ai/docs/authentication – Alan

ответ

1

joe.getresponse() не имеет явного возврата, при этом он имеет неявный return undefined;

Вот почему вы видите undefined в вашей консоли вывода.

Причина немного сложная и фундаментальная для программирования javascript, но она связана с Callbacks и асинхронным выполнением javascript.

С этой строкой здесь вы фактически добавляете анонимную функцию в качестве обратного вызова. Эта функция фактически не выполняется, пока она не будет вызвана (как правило, в ответ на событие).

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

Так что пока вы возвращаете отклик, объем этого возвращения не внутри внешней функции getresponse(), но вместо того, чтобы внутри эмиттера response событий.

Вместо этого вам нужно будет зафиксировать значение Response так, как вы можете его получить. Предоставляя свой собственный обратный вызов методу getresponse(), этот обратный вызов будет иметь доступ к объекту ответа.

Это будет выглядеть примерно так:

main.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).

+0

Когда я запускаю это, я получаю сообщение об ошибке onResponse. Если я читаю это право, функция onResponse должна быть где-то определена, правильно? Является ли этот вызывающий вызов обратным вызовом, на который вы ссылаетесь? – rucker

+0

@rucker Извинения. Я обновил код. – Alan

+0

Yup. Теперь он отлично работает. Спасибо @Alan! – rucker