2013-04-03 7 views

答えて

6

Ajaxが完了するまでに時間がかかるを完了するalert(global_arr); //get null, it doesn't work properly実行前にあるためである

+0

よくできました、ありがとう!興味深い。 – user2241859

+0

これは特に非同期の最初の方法についてかなりのことを学びました。つまり、基本的にどのようにajaxメソッドが完了するのを待つかです。ありがとう。 – racl101

5

Ajaxは非同期です。 JSエンジンが機能していないalert()行に到達した時点で、AJAX呼び出しはまだサーバーからの応答を得て変数を設定する機会はありませんでした。

そのため、内部警告()が機能します。サーバーから応答が入ったときに実行されます。 $.ajax

0

。関数の実行にはほとんど時間がかかりません。だから、あなたがAjaxリクエストの外でアラートを受け取る頃には、Ajaxリクエストはまだ完了するのに時間を費やしています(送信中またはサーバー側のアクションのいずれか)。

いつでもajaxメソッドが完了するのを待つことができます。

$(document).ready(function() { 

var global_arr = new Array(); 
var complete = false;//flag to wait for ajax completion 
$.ajax({ 
    url: 'result.php', 
    type: 'post', 
    dataType: 'json', 
    success: function(data) { 
    $.each(data, function(key, value) { 
     global_arr.push(value.name); 
    }); 
    alert(global_arr); //get correct value, works fine 
    complete = true;//mark ajax as complete 
    } 
}); //end of ajax function 

(function runOnComplete(){ 
    if(complete){//run when ajax completes and flag is true 
    alert(global_arr); 
    }else{ 
    setTimeout(runOnComplete,25);//when ajax is not complete then loop 
    } 
})() 
}); 

ただし、最も一般的な方法はコールバックを使用することです。

$(document).ready(function() { 

function runOnComplete(){//code executes once ajax request is successful 
    alert(global_arr); 
} 
var global_arr = new Array(); 
$.ajax({ 
    url: 'result.php', 
    type: 'post', 
    dataType: 'json', 
    success: function(data) { 
    $.each(data, function(key, value) { 
    global_arr.push(value.name); 
    }); 
    alert(global_arr); //get correct value, works fine 
    runOnComplete();//callback 
    } 
}); //end of ajax function 
}); 
0

私の提案は、これを3つのファンクションに分解することです。もう少し意味があります。 ajax、handelRequest、onCompleteが必要です。 また、エラーハンドラをajax関数に追加して、エラーが発生した場合は、スクリプトをユーザにロックアウトさせることもできます。

$(document).ready(function() { 

    var global_arr = new Array(); 

    $.ajax({ 
     url: 'result.php', 
     type: 'post', 
     dataType: 'json', 
     success: handelRequest(data), 
     error: handleError    
    }); 

    function handelRequest(data) {   
     $.each(data, function (key, value) { 
      global_arr.push(value.name); 
     }); 
     onComplete(global_arr); //get correct value, works fine 
    } 

    function onComplete(global_arr){ 
     // then here you can do what ever you 
     // you would like with the array 
     alert(global_arr); 
    } 

    function handleError(){ 
     // gracefully fail 
    } 

}) 
+0

ありがとう! – user2241859

関連する問題