2017-10-02 21 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); 
    }); 
} 

しかし、すぐにコールバックを受け取る機能を返すようにお勧めしません条件に基づいて、または非同期操作を実行してから復帰します。非同期操作が完了したときに関数がコールバックを受け付けず、そのコールバックを呼び出さない場合、関数は非同期操作が完了する前に実行されます。例:

function mixedUp(options) { 
    Discovery.query({options}, function (err, results) { 
    if (err) return err; 
    return results; 
    }); 
    return 'default value'; 
} 

検出要求が完了する前に関数が返されているため、これは常にデフォルト値を返します。

あなたの関数は、関数の最後の引数である慣用ノードのコールバックまたはdoneパラメータを受け入れるようにする必要があります。 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) - それを定義するコールバック関数を提供する必要があります。例えばこれは呼び出し先の実行中に定義され、呼び出し元は呼び出されたときに結果が得られます。 –

関連する問題