传递xhr.onload的结果

时间:2011-05-28 17:48:03

标签: javascript callback titanium xmlhttprequest

这应该是一个非常简单的概念,但我只是不明白。在Titanium应用程序中,我有几个窗口使用的数据数组,我的xhr结果需要传递到我的应用程序命名空间的顶层才能添加到数组中。我可以成功解析onload函数中的JSON响应,但我想将我的数据代码与我的UI生成分开。

这是一个简化的app.js版本,以便我可以理解这个概念。不,我不会在我的真实应用程序中污染全局命名空间。

Titanium.UI.setBackgroundColor('#000');
var myArray = [];
var xhr = Titanium.Network.createHTTPClient();
xhr.onload = function() {
    myArray = JSON.parse(this.responseText);
    // var data = JSON.parse(this.responseText); // no help
    // myArray.push(data); // no help
    // return myArray; // no help
};
xhr.onerror = function() {
    Titanium.UI.createAlertDialog({ message:"Something has gone terrible wrong."});
};
xhr.open('GET','http://myapp.com/data.json');
xhr.send();
var win = Ti.UI.createWindow();
var view = Titanium.UI.createView({
    backgroundColor:'green'
});
var caption = myArray[2].caption;
var label = Ti.UI.createLabel({
    color:'white',
    text:caption,
    textAlign:'center'
});
view.add(label); 
win.add(view);
win.open();

感谢您的耐心等待!

修改

这从用户的角度产生了正确的结果,但我想访问onload函数范围之外的数组。我不希望将UI代码与API调用混合在一起。

xhr.onload = function() {
    myArray = JSON.parse(this.responseText);
    var caption = myArray[2].caption;
    var label = Ti.UI.createLabel({
        color:'white',
        text:caption,
        textAlign:'center'
    });
    view.add(label); 
};

2 个答案:

答案 0 :(得分:2)

代码正在异步运行。标签试图在xhr.onload开始之前生成。

你应该从代码的onload方法中激活一个事件。

该事件将在您的应用程序的UI部分中有一个侦听器,它将提供http代码与ui代码的适当分离;像这样的东西

xhr.onload = function() {
    myArray = Ti.App.fireEvent("app.updateLabel",
                      {"responseText":this.responseText});
};
在您的用户界面中

,查看代码

Ti.App.addEventListener("app.updateLabel",function(data) {
    myArray = JSON.parse(data.responseText);
    var caption = myArray[2].caption;
    var label = Ti.UI.createLabel({
        color:'white',
        text:caption,
        textAlign:'center'
    });
    view.add(label); 
});

有关来自appcelerator documentation

的事件的更多信息

我在my blog, http://blog.clearlyinnovative.com上也有一些例子,也是

答案 1 :(得分:0)

我不确定你在问什么,但我确实看到了一个问题。您正在创建一个JSON对象,而不是一个myArray = JSON.parse(this.responseText);的数组。对象没有.push()方法,因此解释了 no help 注释。我还注意到您将其定义为array,然后为其分配了JSON object