2017-01-25 12 views
1

私はユーザ入力メッセージを処理し、それに応じてMicrosoftボットフレームワークのnode.js SDKで応答を送信する関数を呼び出しています。このシナリオは次のとおりです。ボットがユーザーからのメッセージを受信すると、私は実行するのに時間がかかるprocessMessage関数を呼び出しています。 は、processMessageが実行された後に得られる結果です。ボットは途中で応答しているため、未定義の値を送信しています。 processMessageの実行が完了する前に、滝の次のステップを確実に実行する方法はありませんか?ここに私のコードは次のとおりです。マイクロボットのフレームワークで2番目の関数を実行する前に1つの関数が実行されるのを待つ方法はありますか?

var connector = new builder.ConsoleConnector().listen(); 
var bot = new builder.UniversalBot(connector); 

bot.dialog('/', [ 
    function (session) { 
     console.log('step1') 
     processMessage(session.message.text); 
    }, 
    function(session) { 
     console.log('step3') 
     session.send(processedResult); 
    } 
]); 

console.log('step2')processMessageの定義です。ログの順序はstep1、step3、step2です。

+0

は 'processMessage'は、コールバックを取るのか? – SimpleJ

+0

いいえ、しかし、コールバックが役に立ったら、私はそれを追加します。コールバックがあればそれを説明してください。 –

答えて

0

processMessage関数はPromiseを返す必要があります。あなたはステップ3のログを行うには.thenを実行するだけです。以下の(それはマイナーなエラーが含まれているかもしれないので、私は、ここにコードを書いた)

function processMessage(text) { 
return new Promise(resolve, reject) => { 
    console.log(text); 
    var processedResult = 'myProcessedResult'; 
    resolve(processedResult); 
} 
} 

bot.dialog('/', [ 
    function (session) { 
     console.log('step1') 
     processMessage(session.message.text).then(processedResult) => { 
     console.log('step3') 
     session.send(processedResult); 
    } 
]); 

約束のような

何かがNode.js/Javascript世界では一般的なパターンです。例えば、hereのように、それらについて読むことができます。

this sampleでは、このアプローチがどのように使用されているかが分かります。the callerfunction returning a Promiseです。

0

コールバックDP(コールバックから戻るときは、次またはプロンプトを呼び出すことができますいずれか)との代替:

var processMessage = (callback) => { 
    request('...', (a, b, b) => { 
     callback(null, 'ok'); 
    }); 
} 

bot.dialog('/', [ 
    function (session, next) { 
     console.log('step1') 
     processMessage(session.message.text, (err, result) => { 
      session.send(result); 
      next(); 
     }); 
    }, 
    function(session, next) { 
     console.log('step3') 
     processMessage(session.message.text, (err, result) => { 
      builder.Prompts.confirm(session, result); 
     }); 
    } 
]); 
関連する問題