2017-01-23 211 views
1

我是新来的JavaScript,不能找出如何解决这个问题里面。我目前正在尝试创建一个个人推特机器人,它可以在新推文上提醒我,看到新的关注者等。我正在用node.js和npm软件包Twit编写这个机器人。我目前正在尝试创建一个创建新Tweets的函数。我的问题是,如果我尝试运行我的代码,我从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中它似乎并不喜欢这个工作。有人能帮我解决这个问题吗?

回答

2

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

这里有arrow functions一组文档。尤其要注意箭头函数在处理类变量(如thissuper)方面的参考。

这样做的唯一可能的缺点是,箭头功能在预ES6语言环境中工作,所以你可能需要,如果你需要在你的项目中广泛的浏览器支持使用像巴贝尔一个transpiler。鉴于这是一个服务器端应用程序,但我怀疑这会是一个问题。对于快速回答

+0

非常感谢您的快速回答,现在它工作得很好,并且由于浏览器支持,这只是一个小个人机器人,只有我将在终端(cmd)中使用。再次感谢,祝你有美好的一天:) – Truzze

+0

@Truzze当然!祝你有个美好的一天,不要忘记接受我的或者我的答案,以便让人们知道如果他们遇到同样的问题该怎么办! – furkle

1

您可以通过绑定传递给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"); 
     } 
    } 
); 
} 
+0

感谢,这正是我需要和工作完全正常。我选择接受用户@furkle的答案,因为他提供了更多信息,但您的答案也是正确的。再次感谢,祝你有美好的一天。 :) – Truzze

相关问题