所以我正在创建一个节点/快速应用程序以获得乐趣,我创建了一个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;
答案 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) {
// ...
}
);
});
有关详细信息,请参阅以下问题: