2017-01-03 125 views
4

我使用Microsoft bot框架來創建一個「簡單」的PoC bot。我用一個tutorial作爲基礎並對其進行擴展。node.js解析承諾並返回值

我有幾個不同的意圖(即問候,再見等)和一個有更多的邏輯(reqstatus)的基本功能。

簡單的(即greeting.js)很好地返回答案,但更復雜的答案不會(reqstatus.js)。在獨立腳本中運行reqstatus.js的主代碼(沒有第一個「const getReqStatus =(entity)=> {」)。

server.js(主) - >查看通話中 「如果(意圖){」 ...

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放在一個函數中,但這也沒有奏效。 經過很多嘗試和谷歌搜索,我仍然卡住,想問問這裏的專家。提前致謝。

回答

3

我認爲問題在於你的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()作爲第二內側參數。這不是getReqStatus函數本身的返回值,因此getReqStatus沒有按預期返回任何內容。

正如您所說,該函數的代碼正確地作爲獨立代碼正確運行,僅僅是因爲它正確設置了偵聽器並且它完成了它所要做的事情。但是,該代碼在封裝到函數中時不會返回Promise。

你需要什麼是返回一個包裝lineReader.on關閉處理,就像一個承諾:

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,並且您如何解決該問題。

+1

'return resolve(output);'只需要解析(輸出);' –

+0

@Sergeon非常感謝您的快速回復。不幸的是,這不起作用...也沒有從Jaromanda建議的調整X – DPM

+0

它現在工作正常。主要問題是我的主要腳本必須傳遞的變量不正確。非常感謝您的支持。 – DPM