所以我正在使用带有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/
它是免费和开源的,除了我最深的感情和温柔的回忆,当我阅读它时,我的大脑以各种有趣的方式成长着,我没有任何隶属关系。

08-15 20:55