所以我正在使用带有twit Node模块的MeteorJS访问tweet的屏幕名称。仍然只是测试代码,看看我是否可以从twitter检索JSON。
这是我的代码:
var Tget = Meteor.wrapAsync(T.get);
Meteor.methods({
'screenName' : function() {
try {
var result = Tget('search/tweets', {q:'#UCLA',count:1});
JSON.stringify(result);
console.log(result);
}
catch (e) {
console.log(e);
return false;
}
}
})
我收到的错误是:
[TypeError: Object #<Object> has no method 'request']
这是twit模块git:https://github.com/ttezel/twit/blob/master/README.md
最佳答案
我想我明白。 Here's the code of T.get
:
Twitter.prototype.get = function (path, params, callback) {
return this.request('GET', path, params, callback)
}
如您所见,它期望
this
具有方法request
。但是,因为我们使用wrapAsync
而不关心执行上下文(accessed with this
),所以它失败了。考虑以下示例(您可以在浏览器控制台中复制/粘贴该示例):
var obj = {
foo : 'foo',
logThis : function() {
console.log(this);
}
};
如果执行
obj.logThis()
,则有:Object { foo: "foo", logThis: obj.logThis() }
But if we do the following...
var otherLogThis = obj.logThis;
otherLogThis();
它记录了
Window
对象,因为我们无法使用该函数!如何解决这个问题?绑定功能?棘手的电话?
不,流星有解决方案。
wrapAsync
can have two parameters ...第二个是上下文!var Tget = Meteor.wrapAsync(T.get, T);
如果您想了解有关JavaScript上下文的更多信息,建议您本书:
https://github.com/getify/You-Dont-Know-JS/
它是免费和开源的,除了我最深的感情和温柔的回忆,当我阅读它时,我的大脑以各种有趣的方式成长着,我没有任何隶属关系。