在ES6类之间传递数据?

时间:2015-09-18 22:56:32

标签: javascript node.js

所以我正在创建一个节点/快速应用程序以获得乐趣,我创建了一个ES6类,它调用Twitter API并获取数据。我们称之为'TwitterClient.es6'。在我的'server.es6'中,我正在提供路由(虽然我最终会改变这样做的方式),并且我想将从我的TwitterClient返回的数据传递给我的服务器。没有数据库(还),可以这样做吗?我当时正在考虑使用getter和setter,但是我稍微离开了,它正在绊倒我。现在,我的getter函数数据未定义,我不知道为什么。更不用说Node很难调试。我已经习惯了React能够传递道具并声明我几乎忘记了如何在普通的旧JS中做到这一点!任何帮助都会很棒。

server.es6

import express from 'express';
import { DB_DEV } from 'database_config';
import bodyParser from 'body-parser';
import util from 'util';
import TwitterClient from 'twitter_client';
import http from 'http';
import debug from 'debug';

const server = express();

server.get('/', function (req, res) {
    var twitter_client = new TwitterClient();
    var data = twitter_client.getData();
    res.send(data);
});

server.listen(3000, function () {
    console.log('Example app listening at ' + 3000);
});

export default server;

TwitterClient.es6

import Twitter from 'twitter';

class TwitterClient {

    constructor() {
        this.fetchTweets();
    }

    fetchTweets() {
        console.log('fetch');
        var self = this;

        var twitter = new Twitter({
            consumer_key: 'xxx',
            consumer_secret: 'xxx',
            access_token_key: 'xxx',
            access_token_secret: 'xxx'
        });

        var params = {
            screen_name: 'jimmyfallon',
            count: 1
        };

        twitter.get('statuses/user_timeline', params, function(error, tweets,   response) {
            if (error) self.handleFetchError(error);
            self.handleFetchSuccess(tweets);
        });

    }

    handleFetchSuccess(tweets) {
        this.set(tweets);
    }

    handleFetchError(error) {
        console.log(error);
    }

    set(data) {
        console.log('I was set!');
        this.tweets = data;
    }

    getData() {
        console.log('I was got!');
        return this.tweets;
    }

    render() {
        console.log('render me timbers!');
        this.getMe();
    }

}

export default TwitterClient;

1 个答案:

答案 0 :(得分:1)

您在getData()完成之前致电twitter.get(..)。这与类和与JavaScript的异步特性有关的一切都没有关系。

我会让class方法返回一个promise。例如:

class TwitterClient {

    constructor() {
        this._tweets = this.fetchTweets();
    }

    fetchTweets() {
        console.log('fetch');
        var self = this;

        var twitter = new Twitter({
            consumer_key: 'xxx',
            consumer_secret: 'xxx',
            access_token_key: 'xxx',
            access_token_secret: 'xxx'
        });

        var params = {
            screen_name: 'jimmyfallon',
            count: 1
        };

        return new Promise(function(resolve, reject) {
            twitter.get('statuses/user_timeline', params, function(error, tweets, response) {
                if (error) reject(error);
                resolve(tweets);
            });
        });

    }

    getData() {
        return this._tweets;
    }

}

export default TwitterClient;

server.get('/', function (req, res) {
    var twitter_client = new TwitterClient();
    twitter_client.getData().then(
        function(data) {
            res.send(data);
        },
        function(error) {
            // ...
        }
    );
});

有关详细信息,请参阅以下问题: