如何使用闭包来访问twitters @Anywhere javascript api?

时间:2010-08-29 07:29:21

标签: javascript twitter closures twitter-anywhere

我想做一些像Java,C#等经典的面向对象语言很容易做到的事情。我只想访问实例化对象的属性。该对象在浏览器的窗口对象中全局范围,由twitter @anywhere API提供。

对于我的代码示例,假设您已经将用户登录。

如果我使用java,我会说(假设所有字段都是公开的:

twttr = new twtter();
String screenName = twtter.currentUser.data('screen_name');

出于某种原因,这在Javascript中很难实现。我已经得到了一个解决方法,在twitter任何API使用的匿名方法内部工作,我将我想要的值设置为DOM元素,然后将其删除。这很丑陋。我只是想直接访问它。

这是我到目前为止所做的,它甚至没有在eclipse中通过语法检查:

function AnywhereFacade()
{
    var twitterReference;
    window.twttr.anywhere
    (
        return function(T)
        {
            twitterReference = T;
        };
    )
    getValue(propertyToGet)
    {
        return twitterReference.currentUser.data(propertyToGet);
    }
};

var anywhereFacade = AnywhereFacade();

var screen_name = anywhereFacade.getValue("screen_name");

alert("screen name is: " + propertyGetter);

请帮忙!为什么Javascript如此难以使用?我想要做的就是使用我认为的闭包。

谢谢!

2 个答案:

答案 0 :(得分:0)

我在我的应用程序中做了类似的事情,因为我使用的是Facebook JavaScript SDK和Twitter SDK,并希望提供一致的界面来访问它们。所以我将变量命名为App。对于任何地方的Twitter,这就是捕获变量的方式。

window.App = {};

twttr.anywhere(function(T) {
    App.Twitter = {
        getValue: function(property) {
            return T.currentUser.data(property);
        },
        getPublicTimeline: function() {
            return T.Status.publicTimelime();
        }
    };
});

我们正在调用anywhere函数并向其传递回调函数。需要回调函数,因为此时可能无法加载任何库。通过传递整个函数,我们说只要加载了任何库,就应该执行这个函数。

现在当库加载时,此函数将执行,定义包含App.Twitter函数的getValue属性。在闭包中捕获任何地方或T对象。

如果你现在打电话,

App.Twitter.getValue("screen_name");

实际上任意对象(T)将用于获取screen_name属性。

答案 1 :(得分:0)

这就是我需要做的全部。

document.getElementById('messagePanel').innerHTML = "loading...";
                window.twttr.anywhere(function(T)
                {

                    document.getElementById('messagePanel').innerHTML = "screen_name: " + T.currentUser.data('screen_name');
                });

这让我意识到我的问题只是因为我从异步调用返回twitter时必须使用回调。这帮我解决了如何为gwt包装它的初始问题。