2017-01-25 75 views
1

我在調用一個處理用戶輸入消息的函數,然後在Microsoft bot框架的node.js SDK中相應地發送響應。這裏是場景:當機器人收到用戶的消息時,我正在調用一個功能processMessage,這需要一些時間來執行。 processedResult是執行processMessage後得到的結果。由於bot過早響應,它發送一個未定義的值。如何確保在processMessage執行完成之前瀑布中的下一步未被執行?這裏是我的代碼:如何在執行微軟bot框架中的第二個函數之前等待一個函數執行?

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。你可以在那裏做一個.then做第3步的日誌。

像下面這樣(我寫到這裏的代碼,所以它可能包含的小錯誤)

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的替代方案(從回調返回時,您可以調用next或提示):

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); 
     }); 
    } 
]); 
相關問題