2016-11-08 4 views
0

이 코드를 작동하지 않는 자바 스크립트 외부로 전화를하면 잘 작동 내가 파괴하려고 할 때, 그러나캡슐화 API.ai 기능이

{ 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 (노드 moda.js)를 실행하면, 내가 콘솔 출력으로 만

undefined 

얻을

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

moda.js.

내가 뭘 잘못하고 있니?

감사합니다.

+0

이 게시물에 api.ai 토큰을 공개했습니다. 반드시 토큰을 즉시 재생성해야합니다. https : //docs.api.ai/docs/authentication – Alan

답변

1

joe.getresponse() 따라서 당신이 당신의 콘솔 출력에 undefined을보고있는 이유 그 암시 return undefined;

을 가지고, 명시 적으로 반환하지 않습니다.

이유는 다소 복잡하고 자바 스크립트 프로그래밍의 기본이지만 콜백 및 자바 스크립트의 비동기 실행과 관련이 있습니다.

이 줄을 사용하면 실제로 익명 함수를 콜백으로 추가하고 있습니다. 이 함수는 호출 될 때까지 (실제로 이벤트에 대한 응답으로) 실제로 실행되지 않습니다.

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

그래. 이제는 훌륭하게 작동합니다. Alan에게 감사합니다! – rucker