返回自定义承诺

时间:2015-07-17 19:50:35

标签: javascript node.js promise invocation

我有一些问题需要定制承诺才能使用我正在处理的小应用程序。

以下是我app.js

的缩写版本
var Promise = require('promise');
var Commands = require('./commands');

var respond = function() {
    var messageToRespondWith = command[0].response;
    if(typeof(command[0].response) == "function"){
        console.log('is function');
        command[0].response().then(console.log('finished'));
    }
    var response = template(messageToRespondWith, {user: user, channel: channel, message: message});
    client.say(channel, response);
};

命令看起来像这样

var config = require('./config');
var Promise = require('promise');

module.exports = [
  {
    trigger: "!random",
    response: function(){
      var unirest = require('unirest');
      var promise = new Promise(function(resolve, reject) {
      unirest.post("https://andruxnet-random-famous-quotes.p.mashape.com/cat=movies")
      .header("X-Mashape-Key", config.mashapeKey)
      .header("Content-Type", "application/x-www-form-urlencoded")
      .header("Accept", "application/json")
      .end(function (result) {
        console.log(result.status);
        // Handle errors
        if(result.status != 200){
          return promise.reject(result.body);
        }else{
          var json = JSON.parse(result.body);
          return promise.resolve(json.quote);
        }
      });
    });
  },
  permission: null
  },
]

app.js代码检查返回的值类型是否为函数,如果是,则执行它并且应该将其保存到变量并将其传递给下一个函数。

我需要使用一个promise,因为很明显底部函数调用client.say()不会等待来自commands.js文件的函数API调用的返回值。

当我尝试执行此代码时,在我的终端中出现此错误...

TypeError: Cannot read property 'then' of undefined
at respond (/***/app.js:39:28)

所以我不确定为什么会发生这种情况,我仍然在学习节点和做事的最佳方式,所以也许我在这里完全走错了路。

基本功能

这是一个抽搐的IRC聊天机器人,它将读取所输入的命令并在与预定消息的聊天中进行响应。在某些情况下,我会想要在吐出消息之前做某种功能。这是其中一个案例。您可以看到我的完整app.js代码here我不想粘贴整个内容,因为它很长并且包含我认为与此无关的部分。

2 个答案:

答案 0 :(得分:2)

您需要在此函数结束时返回promise。默认情况下,您的函数返回" undefined",因此错误。您需要同步返回promise,然后您将异步解析它。

end回调中,您将返回promise.resolve(..),但这不正确。您需要致电promise.resolve(..)但不需要退回。

   response: function(){
      var unirest = require('unirest');
      var promise = new Promise(function(resolve, reject) {
      unirest.post("https://andruxnet-random-famous-quotes.p.mashape.com/cat=movies")
      .header("X-Mashape-Key", config.mashapeKey)
      .header("Content-Type", "application/x-www-form-urlencoded")
      .header("Accept", "application/json")
      .end(function (result) {
        console.log(result.status);
        // Handle errors
        if(result.status != 200){
          promise.reject(result.body);
        }else{
          var json = JSON.parse(result.body);
          promise.resolve(json.quote);
        }
      });
      return promise;
    });

答案 1 :(得分:1)

罗伯特的回答帮助我得到了最终的工作答案。我确实需要返回结果,但即使在尝试返回promise变量并更改rejectresolve以删除它们之前的promise部分之后(如对其答案的评论中所述),我删除了将变量全部放在一起并像这样返回整个承诺

response: function(){
  var unirest = require('unirest');
  return new Promise(function(resolve, reject) {
    unirest.post("https://andruxnet-random-famous-quotes.p.mashape.com/cat=movies")
    .header("X-Mashape-Key", config.mashapeKey)
    .header("Content-Type", "application/x-www-form-urlencoded")
    .header("Accept", "application/json")
    .end(function (result) {
      console.log(result.status);
      // Handle errors
      if(result.status != 200){
        reject(result.body);
      }else{
        var json = JSON.parse(result.body);
        resolve(json.quote);
      }
    });
  });
},