2016-10-05 11 views
0

私は問題があります。コードが別のセッションIDを作成することが高速である可能性があります。私はお互いの後に1つずつ実行する2つの別々のHTTPクライアントを持っています(下記のコードを参照)。私がしている奇妙な問題は、私がやっているすべての2番目のHTTPクライアント要求は、いくつかのセッションデータを取得することです。しかし時にはそれは問題を終了させない、セッション情報が定義されていないときに、データをうまく返します。 2番目のHttpクライアントを削除すると、問題は解決されなくなりました。複数のHTTPクライアント要求がセッションデータを格納していない

私はそれが非同期クライアントにダウンする可能性があると思う、私は次の操作のために同じHttpクライアント変数を再利用することができ、セッションデータが保持されるだろうか?どんな提案や知識があれば大いに感謝します。

this.login = function(username, password, loaded, failed, incorrect) { 
     var xhr = Ti.Network.createHTTPClient({ 
      onload : function(e) { 
       var response = this.responseText; 
       switch(response) { 
       case "1": 
        loaded(); 
        break; 
       case "0": 
        incorrect(); 
        break; 
       case "2": 
        incorrect(); 
        break; 
       case "3": 
        incorrect(); 
        break; 
       default: 
        failed(); 
       } 
      }, 
      onerror : function(e) { 
       failed(e); 
      }, 
      timeout : 5000, 
      validatesSecureCertificate : false 
     }); 
     xhr.open('POST', this.url, true); 
     xhr.send({ 
      'action' : 'login', 
      'email' : username, 
      'password' : password, 
     }); 

     var getdb = Ti.Network.createHTTPClient({ 
      onload : function(e) { 
       var response = this.responseText; 
       Ti.App.Properties.setString('name', response); 
      }, 
      onerror : function(e) { 
       failed(e); 
      }, 
      timeout : 5000, 
      validatesSecureCertificate : false 
     }); 
     getdb.open('POST', this.url, true); 
     getdb.send({ 
      'action' : 'get_name', 
      'device' : 'mobile'  
     }); 

    }; 

答えて

1

問題は、両方の呼び出しを同時に実行していることです。実行の順序は不明です。あなたがしなければならないことは、最初の仕事が終わった後に2番を呼び出すことです。これを動作させるには、最初のコールバック内に2番目のhttpコールを追加する必要があります。

さらにコードを整理するために、関数を使用することをお勧めします。さらに読みやすくします。コールバック関数を取得する最初のものは、HTTPコールバックに得た後

function doBothCalls(){ 
    doFirstCallFunction(function(){ 
     doSecondCallFunction(); 
    } 
} 

doFirstCallFunctionはその後、このコールバック関数は、あなたが呼び出す必要があります。

0

ここで必要なものは、PromisesというJavascriptです。

あなたは非同期呼び出しを行うと、あなたが(あなたのコードでやっている)同じ実行コンテキスト

で別の非同期呼び出しの結果に依存する非同期呼び出しを行うことができないので、それらはすべて、時間のランダムな順序で起こります

はこれを克服するためには、JavaScriptを一言で言えば手段にpromisesための機能があります。

Aプロミスオブジェクトがまだ利用できない場合が値を表すのが、将来のある時点で解決されます。より同期的な方法で非同期コードを記述することができます。たとえば、プロミスAPIを使用してリモートWebサービスへの非同期呼び出しを行う場合、将来、Webサービスによって返されるデータを表すPromiseオブジェクトが作成されます。

+0

これを実装するためにサードパーティのツールを使用しない限り、約束は利用できませんので、実際には良い解決策ではありません。 –

+0

私はあなたの解決策であり、OPはいくつか前進するための提案と私は、彼が探しているものとして、正確に約束されていることについて何らかの洞察を与えました。あなたのロジックに従うと、Node.jsはすべてをモジュールとして使用する必要があります。 Titaniumでは、約束を使用するには、RSVPというパッケージが必要です。 [appceleratorチタンで約束を使用する](http://shockoe.com/blog/using-promises-with-appcelerator-titanium/)。私はあなたの論理を恐れています。 – Cyclotron3x3

関連する問題