node.js解析promise并返回值

DPM*_*DPM 6 javascript asynchronous node.js promise

我使用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. '))
  })
  ...
Run Code Online (Sandbox Code Playgroud)

greetings.js - >返回字符串ok

const getGreetings = () => {
  const answers = ['Hi, my name is SuperBot. Nice to meet you!', ] 
  return Promise.resolve((answers))
  }
module.exports = getGreetings
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

我也尝试将getReqStatus放在一个函数中但是也没有用.经过大量的尝试和谷歌搜索,我仍然卡住了,并想在这里问专家.非常感谢提前.

Ser*_*eon 5

我认为问题在于你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); 
});
Run Code Online (Sandbox Code Playgroud)

你将你传递给lineReader.on()的第二个参数的匿名回调函数中返回一个Promise .这不是getReqStatus函数本身的返回值,因此getReqStatus不会像预期的那样返回任何内容.

正如你所说,该函数的代码作为独立代码正确运行,只是因为它正确地设置了监听器并且它完成了它必须做的事情.但是,该代码在包装在函数中时不会返回Promise.

你需要的是返回一个包装lineReader.onclose处理程序的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);
        });
    });
}
Run Code Online (Sandbox Code Playgroud)

我说因为我真的不知道这个代码是否有效,我对Microsoft Bot框架没有任何经验,并且根本没有使用该readline模块.但是,即使这不能解决您的问题,我希望它能帮助您理解为什么您的函数不返回Promise以及如何解决它.

  • `return resolve(output);`只需要`resolve(output);` (4认同)