Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/466.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何从同一类中的另一个函数调用函数_Javascript_Node.js - Fatal编程技术网

Javascript 如何从同一类中的另一个函数调用函数

Javascript 如何从同一类中的另一个函数调用函数,javascript,node.js,Javascript,Node.js,我是javascript新手,不知道如何解决这个问题。我目前正在尝试创建一个小型个人推特机器人,在新推特上“提醒”我,查看新的关注者等。我正在使用node.js和npm包Twit编写这个机器人。我目前正在尝试创建一个创建新tweet的函数。我的问题是,如果我尝试运行代码,node.js会出错 这是我的bot.js文件 var config = require("./app/config"); var TwitterBot = require("./app/classes/TwitterBot")

我是javascript新手,不知道如何解决这个问题。我目前正在尝试创建一个小型个人推特机器人,在新推特上“提醒”我,查看新的关注者等。我正在使用node.js和npm包Twit编写这个机器人。我目前正在尝试创建一个创建新tweet的函数。我的问题是,如果我尝试运行代码,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)

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

您可以通过绑定传递给
this.T.post()的回调函数或使用arrow函数来避免这个问题。将
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");
      }
    }
  );
}

使用箭头功能。
function(){}
表示法的一个问题是它将
this
更改为窗口对象。如果改为使用
()=>{}
,则
引用应保持您希望的值(例如,您的类)

这里有一组关于的文档。请特别注意有关箭头函数在处理类变量方面的差异的引用,如
this
super


唯一可能的缺点是,箭头功能在ES6之前的语言环境中不起作用,因此如果您的项目中需要广泛的浏览器支持,您可能需要使用Babel之类的transpiler。考虑到它是一个服务器端应用程序,我怀疑这会是一个问题。

非常感谢您的快速回答,现在它工作得非常好,而且由于浏览器支持,这只是一个只有我在终端(cmd)中使用的小型个人机器人。再次感谢您,祝您度过愉快的一天:)@Truzze当然!祝你度过愉快的一天,别忘了接受我或艾德霍尔德的答案,这样人们就会知道如果他们遇到同样的问题该怎么办!谢谢你的快速回答,这正是我所需要的,效果非常好。我选择接受用户@furkle的答案,因为他提供了更多信息,但你的答案也是正确的。再次感谢您,祝您度过愉快的一天。:)
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");
      }
    }
  );
}