【问题标题】:How to call function from another function inside the same class如何从同一个类中的另一个函数调用函数
【发布时间】:2017-01-24 05:06:59
【问题描述】:

我是 javascript 新手,不知道如何解决这个问题。我目前正在尝试创建一个小型个人 twitter 机器人,它可以在新推文上“提醒”我,查看新的关注者等。我正在使用 node.js 和 npm 包 Twit 编写这个机器人。我目前正在尝试创建一个创建新推文的函数。我的问题是,如果我尝试运行我的代码,我会从 node.js 收到错误。

这是我的 bot.js 文件

var config = require("./app/config");
var TwitterBot = require("./app/classes/TwitterBot");
var Twit = require("twit");

var T = new Twit(config);
var app = new TwitterBot(T);

app.tweet({ text: 'This is my test Tweet.' });

我的班级档案

module.exports = class TwitterBot {
  constructor(T) {
    this.T = T;
    this.colors = require('colors/safe');
    console.log("Class works");
  }

  tweet(data) {
    this.T.post(
      'statuses/update',
      { status: data.text },
      function(err, data, response) {
        if (err) {
          this.error("Something went wrong");
        } else {
          this.success("Tweet successfully created");
        }
      }
    );
  }

  error(something) {
    console.log("Error: " + something);
    // This is just an example in my code it performs a switch function
  }

  success(something) {
    console.log("Success: " + something);
    // This is just an example in my code it performs a switch function
  }

}

我的错误:

Class works
C:\Users\Colin\Desktop\Twitter-Bot\app\classes\TwitterBot.js:14
          this.error('tweet', err);
              ^

TypeError: Cannot read property 'error' of undefined
    at C:\Users\Colin\Desktop\Twitter-Bot\app\classes\TwitterBot.js:14:15
    at C:\Users\Colin\Desktop\Twitter-Bot\node_modules\twit\lib\twitter.js:118:13
    at onRequestComplete (C:\Users\Colin\Desktop\Twitter-Bot\node_modules\twit\lib\twitter.js:324:7)
    at Request.<anonymous> (C:\Users\Colin\Desktop\Twitter-Bot\node_modules\twit\lib\twitter.js:341:7)
    at emitOne (events.js:101:20)
    at Request.emit (events.js:188:7)
    at Gunzip.<anonymous> (C:\Users\Colin\Desktop\Twitter-Bot\node_modules\request\request.js:1001:12)
    at Gunzip.g (events.js:291:16)
    at emitNone (events.js:91:20)
    at Gunzip.emit (events.js:185:7)
    at endReadableNT (_stream_readable.js:974:12)
    at _combinedTickCallback (internal/process/next_tick.js:74:11)
    at process._tickCallback (internal/process/next_tick.js:98:9)

我的问题是我无法从我的 TwitterBot 类中的所有推文函数中调用函数(错误或成功)。我习惯在php中这样写代码

  public function tweet($text) {
    // ... Some function that sends the tweet and returns ($err, $data, $response)
    if ($err) {
      // I call other functions inside the same class with $this->functionName();
      $this->error($err);
    }
  }

  protected function error($err) {
    // do something with the $err variable
  }

但在 javascript 中,它似乎不是这样工作的。有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: javascript node.js


    【解决方案1】:

    使用箭头函数。 function() { } 表示法的问题之一是它将this 更改为窗口对象。如果您改用 () =&gt; { },则 this 引用应保持您希望的值(例如您的班级)。

    这是arrow functions 上的一组文档。请特别注意箭头函数在处理 thissuper 等类变量方面的不同之处。

    唯一可能的缺点是箭头函数在 ES6 之前的语言环境中不起作用,因此如果您的项目需要广泛的浏览器支持,您可能需要使用像 Babel 这样的编译器。鉴于它是一个服务器端应用程序,但我怀疑这将是一个问题。

    【讨论】:

    • 非常感谢您的快速回答,现在它工作得非常好,而且由于浏览器的支持,这只是一个小的个人机器人,只有我会在终端 (cmd) 中使用。再次感谢,祝你有美好的一天:)
    • @Truzze 当然!祝您有美好的一天,不要忘记接受我或 idbehold 的回答,这样人们就知道如果遇到同样的问题该怎么办!
    【解决方案2】:

    您可以通过绑定传递给this.T.post() 的回调函数或使用箭头函数来避免这种情况。将tweet 方法更改为:

    tweet(data) {
      this.T.post(
        'statuses/update',
        { status: data.text },
        (err, data, response) => { // this line got changed
          if (err) {
            this.error("Something went wrong");
          } else {
            this.success("Tweet successfully created");
          }
        }
      );
    }
    

    【讨论】:

    • 感谢您的快速回答,这正是我所需要的,并且工作得很好。我选择接受用户@furkle 的回答,因为他提供了更多信息,但您的回答也是正确的。再次感谢,祝您有美好的一天。 :)
    猜你喜欢
    • 1970-01-01
    • 2015-07-03
    • 1970-01-01
    • 1970-01-01
    • 2016-01-09
    • 2013-08-10
    • 1970-01-01
    • 2020-07-03
    • 2012-06-22
    相关资源
    最近更新 更多