0

こんにちは、Titanium Studio ビルド: 2.1.1.201207271312 のネットワーク関数から取り込まれたテーブル ビューが取り込まれたウィンドウを取得しようとしています。データは適切にフェッチされていますが、問題は、テーブル ビューが適切に取り込まれるのを待たずにプログラムが実行され続けることです。コードは次のとおりです。

ui.js:

bs.ui.createTransitRoutesListWindow = function() {

    var winbsRoutesList = Titanium.UI.createWindow({
    });
    var tv2 = Ti.UI.createTableView();
    tv2 = bs.ui.createbsRouteListTableView();

    winbsRoutesList.add(tv2);       
};

bs.ui.createbsRouteListTableView = function() {

    var tv = Ti.UI.createTableView();       

    Ti.API.info('populating data');
        var busStopList = bs.db.routeStopList(); 

        tv.setData(busStopList);

        return tv;

};

デシベル.js:

 bs.db.routeStopList = function() {
var stoplist = [];

bs.net.getRoutes(function(data) {
    Ti.API.info('data length: '+data.length);
    for (var i = 0;i<data.length;i++) {
        stoplist.push({
            title:data[i].stopName,
            id: i
        });
    }

});
return stoplist;
 }

network.js

bs.net.getRoutes = function(_cb) { 

    var xhr = Titanium.Network.createHTTPClient();
    xhr.onload = function() {  
        _cb(JSON.parse(this.responseText));

    Ti.API.info(this.responseText)
    };
    xhr.onerror = function(event) {
    }
    xhr.open("GET","<URL to valid JSON>", true);  
    //+ Ti.App.Properties.getString('currentBus','This is a string default')
    xhr.send();

};
4

1 に答える 1

0

bussearch.net.getRoutes()は AJAX 操作であるため、非同期です。これは、コードが完了するまで待機しないことを意味します。応答が行われている間、コードは続行されます。それが応答する時間も不明です。

データが返された後に何かをしたい場合は、代わりにコールバックですべてを行うか、jQuery などの遅延オブジェクト (基本的にはコールバック コンテナー) を作成する必要があります。

//db.js
bussearch.db.routeStopList = function(callback) {
    var stoplist = [];
    bussearch.net.getRoutes(function(data) {
        ....
        callback.call(this,stoplist);
    });
}

//ui.js
bussearch.ui.createBussearchRouteListTableView = function(callback) {
    var tv = Ti.UI.createTableView();       
    Ti.API.info('populating data');
    bussearch.db.routeStopList(function(busStopList){
        tv.setData(busStopList);
        callback.call(this,tv);
    }); 
};

//calling createBussearchRouteListTableView()
createBussearchRouteListTableView(function(tv){
    //tv in here is the data
    //do inside here what you want to do to tv after it's retrieved
});
于 2012-08-14T22:30:54.870 に答える