[英]node.js resolve promise and return value
我使用Microsoft bot框架來提出一個“簡單”的PoC機器人。 我使用教程作為基礎並擴展它。
我有幾個不同意圖的基本功能(即問候,再見等)和一個有更多邏輯的功能(reqstatus)。
簡單的(即greeting.js)很好地返回答案,但更復雜的答案(reqstatus.js)。 在獨立腳本中運行reqstatus.js的主代碼(沒有第一個“const getReqStatus =(entity)=> {”)。
server.js (main) - >請參閱“if(intent){”中的調用...
const getFeelings = require('./intents/feelings.js')
const getGoodbyes = require('./intents/goodbyes.js')
const getGreetings = require('./intents/greetings.js')
const getHelp = require('./intents/help.js')
const getReqStatus = require('./intents/reqstatus.js')
...
const bot = new builder.UniversalBot(connector)
// Intents based on definitions on recast
const INTENTS = {
feelings: getFeelings,
goodbyes: getGoodbyes,
greetings: getGreetings,
help: getHelp,
reqstatus: getReqStatus,
}
// Event when Message received
bot.dialog('/', (session) => {
recastClient.textRequest(session.message.text)
.then(res => {
const intent = res.intent()
const entity = res.get('request_number')
console.log(`UserName: ${session.message.user.name}`)
console.log(`Msg: ${session.message.text}`)
console.log(`Intent: ${intent.slug}`)
if (intent) {
INTENTS[intent.slug](entity)
.then(res => session.send(res))
.catch(err => session.send(err))
}
})
.catch(() => session.send('Sorry I didn\'t get that. '))
})
...
greetings.js - >返回字符串ok
const getGreetings = () => {
const answers = ['Hi, my name is SuperBot. Nice to meet you!', ]
return Promise.resolve((answers))
}
module.exports = getGreetings
reqstatus.js - >不返回任何內容
const getReqStatus = (entity) => {
var request = require('request');
var request_number = entity.toLowerCase()
var output = [];
// Processing
var lineReader = require('readline').createInterface({
input: fs.createReadStream('netreqs.csv')
});
lineReader.on('line', function (line) {
var jsonFromLine = {};
var lineSplit = line.split(';');
jsonFromLine.req = lineSplit[0];
jsonFromLine.req_count = lineSplit[1];
jsonFromLine.req_type = lineSplit[2];
//...
var req_lowever = jsonFromLine.req.toLowerCase()
if (req_lowever == request_number) {
output.push( `Your request ${jsonFromLine.req} was received`);
// simplified
}
});
// Output
lineReader.on('close', function (line) {
if (output == '') {
output.push( `I was not able to find a request like ${request_number}.`);
}
console.log(output); // list output
return Promise.resolve(output);
});
}
module.exports = getReqStatus
我也嘗試將getReqStatus放在一個函數中但是也沒有用。 經過大量的嘗試和谷歌搜索,我仍然卡住了,並想在這里問專家。 非常感謝提前。
我認為問題是你的getReqStatus
並沒有真正返回任何東西。 在您的示例getGreetings
函數中,您實際上將Promise.resolve(answers)
作為該函數的返回值返回。
但是,在getReqStatus
函數中,您只需設置一個偵聽器lineReader close
事件:
lineReader.on('close', function (line) {
if (output == '') {
output.push( `I was not able to find a request like ${request_number}.`);
}
console.log(output); // list output
return Promise.resolve(output);
});
你將在你傳遞給lineReader.on()
作為第二個參數的匿名回調函數中返回一個Promise。 這不是getReqStatus
函數本身的返回值,因此getReqStatus
沒有按預期返回任何內容。
正如你所說,該函數的代碼作為獨立代碼正確運行,只是因為它正確地設置了監聽器並且它完成了它必須做的事情。 但是,該代碼在包裝在函數中時不會返回Promise。
你需要的是返回一個包含lineReader.on
關閉處理程序的Promise,如:
function getReqStatus(){
//...code
return new Promise( function(resolve , reject ){
lineReader.on('close', function (line) {
if (output == '') {
output.push( `I was not able to find a request like ${request_number}.`);
}
console.log(output); // list output
return resolve(output);
});
});
}
我說會因為我真的不知道這段代碼是否有效,我對Microsoft Bot框架沒有任何經驗,而且根本沒有使用readline
模塊。 但是,即使這不能解決您的問題,我希望它能幫助您理解為什么您的函數不返回Promise以及如何解決它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.