1

私は現在、最初のチタニウムiPhoneアプリを製作中です。私が得たモデルでチタンmvc - 関数を呼び出して結果を待つ

(function() { 
    main.model = {}; 

    main.model.getAlbums = function(_args) { 

     var loader = Titanium.Network.createHTTPClient(); 
     loader.open("GET", "http://someurl.json"); 

     // Runs the function when the data is ready for us to process 
     loader.onload = function() { 
      // Evaluate the JSON 
      var albums = eval('('+this.responseText+')'); 
      //alert(albums.length); 
      return albums; 
     }; 

     // Send the HTTP request 
     loader.send(); 

    }; 

})(); 

と私のような観点でこの関数を呼び出す:それはHTTPを使用していくつかのデータをフェッチするモデルへの呼び出し(ように思えるしかし

(function() { 

    main.ui.createAlbumsWindow = function(_args) { 

     var albumsWindow = Titanium.UI.createWindow({ 
      title:'Albums', 
      backgroundColor:'#000' 
     }); 

     var albums = main.model.getAlbums(); 

     alert(albums); 

     return albumsWindow; 
    }; 
})(); 

)は応答を待つことはありません。私がアラートをするときに、まだモデルからデータを受け取っていないという見方では、どのようにしてベストプラクティスでこれを行うのですか?

あなたがサービスからの応答を得るまでそれがお待ちしておりますように、あなたが必要なもの事前

答えて

6

OK、このような

何か、

function foo(arg1, callback){ 
    arg1 += 10; 
    .... 
    ... Your web service code 
    .... 
    callback(arg1); // you can have your response instead of arg1 
} 

you will call this function like this, 

foo (arg1, function(returnedParameter){ 
    alert(returnedParameter); // here you will get your response which was returned in above function using this line .... callback(arg1); 
}); 

ので、ここでarg1には、パラメータ(整数のような単純なパラメータ、文字列など)であり、第二引数は、あなたのコールバック関数です。

乾杯。

+0

魅力のように働きます - ありがとう、たくさんの仲間:) –

+0

あなたは大歓迎です。 –

+0

これは素晴らしい例です。私の例では、モーダルを開き、ユーザーから情報を収集し、モーダルを閉じてから、インデックスビューを再度開こうとしていました。私はコールバックを正しく取得していましたが、インデックスビューはその後に表示されませんでした。 modal.close()を使用する代わりに、私はmodal.hide()を使用しました。これにより、インデックスビューが表示されました。これが誰かを助けることを願っています –

3

のおかげでは、Webサービスへの同期呼び出しです。あなたは、パラメータとしてコールバック関数を渡して、代わりにreturn文で値を返すのコールバック関数に戻り値を取得する必要がありますJavaスクリプトでこれを達成するために

あなたが実際に使用しているコーディングスタイルは、私が異なるコーディングスタイルを使用しているため、私にとっては新しいものです。

しかし、主なことは、return文の代わりにコールバック関数を使用して値を取得する必要があることです。これを試してみてください。まだ問題がある場合は、私に例を挙げてみてください。

+0

おかげで多くのことを、以下の に注意してください。私は、コールバック関数を使用するという考え方で遊んできました。あなたが私に例を与えることができれば素晴らしいでしょう - あなたが気にしないならば:) –

0

ゼロのようなコールバックの方法はうまく説明されて説明していますが、それはイベントで処理を取得しようとすることができます。

(function() { 

    main.ui.createAlbumsWindow = function(_args) { 

     var albumsWindow = Titanium.UI.createWindow({ 
      title:'Albums', 
      backgroundColor:'#000' 
     }); 

     var status = new object(), // eventlistener 
     got_a_valid_result = false; 

     // catch result 
     status.addEventListener('gotResult',function(e){ 
      alert(e.result); 
      got_a_valid_result = true; 
     });   

     // catch error 
     status.addEventListener('error',function(e){ 
      alert("error occured: "+e.errorcode); 
      git_a_valid_result = true; 
     }); 

     var albums = main.model.getAlbums(status); 

     // wait for result 
     while (!got_a_valid_result){}; 
     return albumsWindow; 
    }; 
})(); 

し、モデル

main.model.getAlbums = function(status) { 

     var loader = Titanium.Network.createHTTPClient(); 
     loader.open("GET", "http://someurl.json"); 

     loader.onload = function() { 
      var albums = eval('('+this.responseText+')'); 

      status.fireEvent('gotResult',{result:albums}); 
      return albums; 
     }; 

     loader.onerror = function(e){ 
      status.fireEvent('error',{errorcode:"an error occured"}); 
     }; 

     // Send the HTTP request 
     loader.send(); 

    }; 
+0

共有ありがとう。私はこれについて決して考えなかった。私はこの方法を試してみます。 –

0

のようなものがちょうど提案として、それはすべてのjavascriptのコードを実行されるためにevalを使用して関与するリスクがあるとして代わりにevalのJSON.parseを使用しようとするかもしれません。

0

私はゼロが掲載ソリューションは、おそらくメモリ管理のためのより良いですが、私は全くわからないと思います。あなたが行うとのEventListener場合は、(https://wiki.appcelerator.org/display/guides/Managing+Memory+and+Finding+Leaksを参照してください)返信用

function doSomething(_event) { 
    var foo = bar; 
} 
// adding this event listener causes a memory leak 
// as references remain valid as long as the app is running 
Ti.App.addEventListener('bad:idea', doSomething); 

// you can plug this leak by removing the event listener, for example when the window is closed 
thisWindow.addEventListener('close', function() { 
// to remove an event listener, you must use the exact same function signature 
// as when the listener was added 
Ti.App.removeEventListener('bad:idea', doSomething); 
}); 
関連する問題