2012-03-08 7 views
0

async:falseに設定すると、関数は正しい値を返しています。しかし、それはブラウザをブロックします。コールバックを追加しようとしましたが、正しい値が返されませんでした。 CALLBACK WITHasyncでJquery ajaxリクエスト:trueが値を返しません

function find_route(array_bustops){ 
     var myresults; 
      $.ajax({ 

      type: 'POST', 
       async: true, //with async:false it works 
      url: 'find_routenum.php', 

      data:{ 

       array_bustops:JSON.stringify(array_bustops) 

      }, 
      dataType:'json', //html,xml 

      success: function(my_results){ 

       myresults=my_results; 


      }, 

      error:function(x,e){ 
       if(x.status==0){ 
       alert('You are offline!!\n Please Check Your Network.'); 
       }else if(x.status==404){ 
       alert('Requested URL not found.'); 

      } 


     }); 

     return myresults; 
    } 

function find_route(array_bustops,callback){ 
     var myresults; 
      $.ajax({ 

      type: 'POST', 
       async: true, //with async:false it works 
      url: 'find_routenum.php', 

      data:{ 

       array_bustops:JSON.stringify(array_bustops) 

      }, 
      dataType:'json', //html,xml 

      success: function(my_results){ 

       callback(array_bustops,my_results) 


      }, 

      error:function(x,e){ 
       if(x.status==0){ 
       alert('You are offline!!\n Please Check Your Network.'); 
       }else if(x.status==404){ 
       alert('Requested URL not found.'); 

      } 


     }); 

     return myresults; 
    } 
    function find_route2(myresults){ 
      return myresults; 
    } 

そして、次のように私は関数を呼び出す:

arr_one=find_route(arr,find_route2) 

しかしarr_oneはundefinedを返します。

EDIT:あなたのコールバックに二つの引数を渡して、一見真

+0

はあなたがいずれかを参照していJavaScriptのエラー? – jrummell

+0

"同期Ajax要求"はコード実行の速度を低下させますか? –

+0

jensでは、メインの実行スレッドがロックされ、jsはajaxリクエストが戻ってくるのを待っている間は何もできません。 –

答えて

3

arr_one = find_route(ARR、find_route2)

これは非同期ではなく、コードのアーキテクチャとは何の関係も持っていません。

find_routeのスコープにmyresultsを宣言します。find_routeを呼び出すと、関数はdelalfのみであるため未定義のmyresultsの値を返します。

var myresults = 'somevalue'を宣言してください。あなたの関数で

今、あなたの関数の戻り値「someValueの」

AJAXメソッドの呼び出しがfind_routeが呼び出された後に実行される方法を関数実行と成功の方法を止めるつもりはないし、ちょうどコンソールを入れて返されるので、これが起こります.logには、成功が呼び出されたときに最終的にログが取得されることがわかります。

非同期あなたはAJAX呼び出しの前に戻ってから機能の実行を停止発見として偽

編集バックであるので、それが設定されている場合、非同期支保工:可能な解決策

function DataListener(val){ 
    this.val = val; 
    this.remoteFetch(); 
} 

DataListener.prototype.set = function(val){ 
    this.val = val; 
    this.notifyListener(val) 
} 
DataListener.prototype.get = function(val){ 
    return this.val; 
} 

DataListener.prototype.remoteFetch = function(){ 
    $.ajax({ 
     success:$.proxy(this, 'set') 
    }) 
} 

var arr_one = new DataListener('somevalue'); 
alert(arr_one.get());// alert somevalue 

function doSomething(arr_one_value){ 
    alert(arr_one_value); // the new value set from the ajax call 
} 

arr_one.addListener(doSomething); 
+0

確かに正しい答え+1 –

+0

あなたは正しいですが、未定義の代わりに返します。 arr_oneの値は「somevalue」になります。私のコードを見てくださいhttp://jsfiddle.net/YtkCh/ –

+0

ええとコールバック関数find_route2は正しい値を取得していますが、どのようにarr_oneに値を返すのですか?私は問題がここに来ると思います。arr_one = find_route(arr、find_route2) find_route 2が正しい値を返しています。その値をarr_oneにどのように割り当てるのですか? –

1

に設定されますが、実際のコールバック関数の中で一つだけを受け入れる:それはまだ非同期に動作しません。

callback(array_bustops,my_results); 

// your callback function 
function find_route2(myresults){ 
     return myresults; 
} 

結果を引数に渡してみてください。

callback(my_results); 
+0

oops申し訳ありませんが、私は変更を加えましたが、asyncをfalseに設定してコードを実行しました。私は完全に失われている、それはまだ動作していません –

+1

ジェンス、エルムチャーチは正しい答えを持っています。コードを再構成する必要があります。 JSはajaxリクエストからの応答を待たずに、ajaxの後に実行するコードをコールバック関数に入れなければなりません。 –

+0

はここに私のコードhttp://jsfiddle.net/YtkCh/です。アラートfind1が未定義に戻ります。警告find2がいくつかの値を返しています –

0
function find_route(array_bustops){ 
      $.ajax({ 

      type: 'POST', 
       async: true, //with async:false it works 
      url: 'find_routenum.php', 

      data:{ 

       array_bustops:JSON.stringify(array_bustops) 

      }, 
      dataType:'json', //html,xml 

      success: function(my_results){ 

       // HOW ABOUT PUTTING THE NEXT DESIRED FUNCTIONALITY HERE? // 
       return my_results 

      }, 

      error:function(x,e) { 
       if(x.status==0) { 
        alert('You are offline!!\n Please Check Your Network.'); 
       }else if(x.status==404) { 
        alert('Requested URL not found.'); 
       } 
       //AND THE DUMMY RETURN VALUE OF THE FUNCTION IS HERE// 
       return FALSE; 
      } 


     }); 

     return myresults; 
    } 
関連する問題