将蓝鸟承诺添加到NodeJS模块,然后没有定义函数

时间:2017-01-08 07:52:49

标签: javascript node.js asynchronous promise bluebird

我是承诺和蓝鸟的新手,在我目前的项目中,我必须处理很多异步API调用,因此我想使用JS promise作为我的主要工具。 我导入的模块之一如下所示:

var Promise = require("bluebird");
var watson = Promise.promisifyAll(require('watson-developer-cloud'));

var conversation = watson.init();

exports.enterMessage = function (inputText) {
  var result;  //want to return
  conversation.message({
    input: {
      "text": inputText
    }
  }, function(err, response) {
    if (err) {
      console.log('error:', err);
      result = err;
    }
    else {
      result = response.output.text;
    }
  });
  console.log(result);  //sync call, result === undefined
  return result;
}

我的问题是我该如何处理这个问题?我理解关于使用IO的承诺的例子,比如fs。所以我尝试通过conversation.message(...).then(function(response){result = response.output.text})模仿方式,但是它表示conversation.message(...)。then()没有定义。

1 个答案:

答案 0 :(得分:2)

感谢 jfriend00 的链接,我修复了逻辑并使用正确的方法处理此异步调用。

这是固定代码:

//app.js
  var Promise = require("bluebird");
  var conversation = Promise.promisifyAll(require('./watson-conversation'));
  conversation.enterMessage(currentInput).then(function(val){
      res.send(val)}
    ).catch(function(err){
      console.log(err)
    });
  });
//watson-conversation.js

var conversation = watson.init();

exports.enterMessage = function (inputText) {
  return new Promise(function(resolve, reject){
    conversation.message({
      input: {
        "text": inputText
      }
    }, function(err, response) {
      if (err) {
        console.log('error:', err);
        reject(err);
      }
      else {
        resolve(response.output.text);
      }
    });
  });
}