2017-10-02 2 views
2

검색과 대화를 어떻게 통합 할 수 있습니까? NodeJS를 사용하고 있지만 문제가 발생하면 이후에 대화 결과를 으로 보내야합니다. 콜백을 사용하려고하지만 아직 행운이 없습니다. 비동기를 사용할 수 있지만이 경우 간단한 콜백을 사용할 수 있습니까? 도와 주셔서 감사합니다!콜백 및 비동기 기능

function updateMessage(res, data) { 
    if (!data.output) { 
    data.output = {}; 
    } else { 
    /* THIS CODE RETURNS CONVERSATION DATA FIRST, CAUSING THE DISCOVERY QUERY 
    TO BECOME UNDEFINED */ 
    if (data.context.callDiscovery === true) { 
     //Query collection 
     Discovery.query(params, function(error, results) { 
     data.output.text = "Getting what you need"; 

     //Set output graph card 
     data.output.graph = { 
      title: results.title, 
      url: result.url, 
      description: results.passage_text 
     }; 

     return results; 
     }); 
    } 
    return data; 
    } 
} 
+0

쿼리 함수 외부에서 데이터를 반환한다는 문제가 아니므로 함수 범위를 이미 벗어 났으므로 콜백이 실행되지 않습니까? – linasmnew

+0

@linasmnew에게 사과드립니다. 나는 지금 모든 기능을 포함시켰다. 반환 된 데이터에 지정된 data.output이없는 경우 범위 외부로 반환해야합니다. – agomez

답변

3

동기화 작업과 비동기 작업이 혼합되어 있습니다.

function (options) { 
    if (options.flag) { 
    return "Flag is set"; 
    } else { 
    return "Flag is not set"; 
    } 
} 

이 함수는 비동기 적으로 반환의 예는 다음과 같습니다 : 여기

함수의 예는 동 기적으로 반환하지만

function (options, done) { 
    Discovery.query({options}, function (err, results) { 
    if (err) return done(err); 
    return done(null, results); 
    }); 
} 

, 바로 콜백을 받아들이는 기능을 반환하지 않는 것이 좋습니다 조건에 따라 또는 비동기 작업을 수행 한 다음 반환합니다. 비동기 작업이 끝날 때 함수가 콜백을받지 않고 해당 콜백을 호출하지 않으면 비동기 작업이 끝나기 전에 함수가 실행을 완료합니다. 예 :

검색 요청이 완료되기 전에 함수가 반환되기 때문에 항상 기본값이 반환됩니다.

당신의 함수가 콜백 (callback)이나 완료 매개 변수 (관용적 노드에서 함수의 마지막 인수)를 받아 들여야합니다. function (options, moreOptions, done/callback/cb)은 함수의 서명이어야합니다. 그런 다음 함수는 작업을 수행 할 때 해당 콜백 함수를 호출해야합니다.

function updateMessage(res, data, done) { 
    if (!data.output) { 
    data.output = {}; 
    return done(null, data); 
    } else { 
    /* THIS CODE RETURNS CONVERSATION DATA FIRST, CAUSING THE DISCOVERY QUERY 
    TO BECOME UNDEFINED */ 
    if (data.context.callDiscovery === true) { 
     //Query collection 
     Discovery.query(params, function(error, results) { 
     data.output.text = "Getting what you need"; 

     //Set output graph card 
     data.output.graph = { 
      title: results.title, 
      url: result.url, 
      description: results.passage_text 
     }; 

     return done(null, results); 
     }); 
    } else { 
     return done(null, data); 
    } 
    } 
} 
+0

자세한 설명은 대단히 감사합니다. 콜백을 훨씬 잘 이해하는 데 도움이되었습니다. 그러나, 당신의 제안을 추가 할 때, 나는'done은 정의되지 않았습니다. ' 왜 이런거야? – agomez

+0

물론 도움이 되었기 때문에 기쁩니다. 함수를 호출하면 (예 : updateMessage (res, data) - 정의 된 콜백 함수를 제공해야한다. 예 : 'updateMessage (res, data, function (err, res) {console.log (err, res)}); 이것은 호출 수신자의 실행 중에 정의되고 호출자는 호출이 끝나면 결과를 얻는다. –