2012-03-16 10 views
0

これは私のiPhoneアプリのモジュールです。目的は、別のモジュールのTableViewのdataプロパティに追加できるJSON responeTextから配列を返すことです。onload関数の結果を変数に渡す

JavaScriptに対して比較的新しいので、自分の配列を変数selfに渡すための正しい構文を見つけることができません。

function Events() { 
var self = []; 

var xhr = Ti.Network.createHTTPClient(); 
xhr.open('GET', 'http://localhost/ngparser/events.php'); 

xhr.onload = function() { 
    var events = JSON.parse(this.responseText), 
     rows = []; 

    Ti.API.info('JSON responseText: '); 
    Ti.API.info(events); 

    for (var i in events) { 
     var id = events[i].id, 
      title = events[i].title;    

     var amp = title.search('&'); 
     if (amp != -1) { 
      title = title.replace('&', '&'); 
     } 

     var row = Ti.UI.createTableViewRow({ 
      title: title, 
      hasChild: true 
     }); 
     rows.push(row);   
    } 

    // I want this... 
    return rows;   
}; 

xhr.send(); 
self = //... to end up here! 
self = xhr.send(); //Does not work 
return self; 
} 

module.exports = Events; 

EDIT:AJAXは非同期であるhttp://developer.appcelerator.com/question/133913/how-do-i-pass-result-from-xhronload-function-to-variable#comment-119031

答えて

2

xhr.onload関数は非同期で実行されていますが、値を返さないため、rows変数を返すことは無意味です。

あなたができることは、コールバック関数内でテーブルビューのsetDataメソッドを使用して、テーブルビューに行の配列を追加することです。

function Events() { 
var self = []; 

var xhr = Ti.Network.createHTTPClient(); 
xhr.open('GET', 'http://localhost/ngparser/events.php'); 

xhr.onload = function() { 
    var events = JSON.parse(this.responseText), 
     rows = []; 

    Ti.API.info('JSON responseText: '); 
    Ti.API.info(events); 

    for (var i in events) { 
     var id = events[i].id, 
      title = events[i].title;    

     var amp = title.search('&'); 
     if (amp != -1) { 
      title = title.replace('&', '&'); 
     } 

     var row = Ti.UI.createTableViewRow({ 
      title: title, 
      hasChild: true 
     }); 
     rows.push(row);   
    } 
    tableView.setData(rows); 

}; 

xhr.send(); 
} 
+0

私はコールバックで遊んでいますが、動作させることはできません。私のeventsCallbackは、info()からの出力がないので、実行されていないようです。ウィンドウモジュール:http://pastebin.com/1kdga075データモジュール:http://pastebin.com/bQVi55Pn –

+0

オンロードコールバックが起動していない場合、エラーが発生する可能性があります。 onerrorコールバックにinfo()を追加して、それがトリガしているかどうか確認してください。 – DannyM

+0

xhr.onload in Events()は実際には関数のinfo()からの出力を取得していますので、EventsWindowのeventsCallback()を意味しています。申し訳ありません。私は "xhr.onerror = function(e){Ti.API.info(e.error);}"をEvents()に追加しました。コンソールにエラーはありません。 –

0

AJAX呼び出しが行われたときに溶液が最終的にここに発見された、onload関数が実行されます。意味JavaScriptはあなたの関数で引き続き、onloadを実行します。つまり、値を返すことはできません。

onload関数内にrows(またはself)変数に関するすべてのコードを配置する必要があります。

関連する問題