2016-07-27 21 views
0

JSスクリプトの冒頭で、私はさまざまな機能でページをすべて使用する必要があるPHPファイルからいくつかのグローバル変数を割り当てる必要があります。jquery ajaxデータを取得してグローバル変数に設定

HTML私は非同期を使用する必要が上記の方法については

<button onclick="somename()"> CALL FUNCTION </button></div> 

JS

var a, 
    b; 

$.ajax({ 
    type: "POST", 
    url: "test.php", 
    data: {getvar: "getvar"}, 
    success: function(data) { 
     a = data["a"]; 
     b = data["b"]; 
    }, 
    dataType: "json", 
    async: false 
}); 

    console.log(a); 
$(document).ready(function() { 
    console.log(a); 
    console.log(b); 
}); 

function somename() { 
    console.log(a); 
} 

::偽が、このすでに非推奨とされていない良い解決策理由だから、最初に私はこのようでしたブラウザはフリーズすることができますが、必要に応じて動作します。 )少なくとも機能somenameの(、

$.post(
    "test.php", 
    {getvar: "getvar"}, 
    function(data) { 
     funget(data);  
    }, 
    "json" 
); 

function funget(param) { 
    $(document).ready(function() { 
     console.log(param["a"]); 
     console.log(param["b"]); 
    }); 

    function somename() { 
     console.log(param["a"]); 
    } 
} 

が、1つの関数で全体のjsスクリプトが同様に良い解決策ではないようです持ついくつか存在することができ動作しません。そこで、私はこのように変更しましたその他の問題。だから、必要に応じて機能し、ソリューションを保存するためには何をすべきか?

答えて

2

ajaxCompleteを使用するか、ajaxコールが完了するのを待ってから進むことができます。

var a, 
b; 

$.ajax({ 
    type: "POST", 
    url: "test.php", 
    data: {getvar: "getvar"}, 
    success: function(data) { 
     a = data["a"]; 
     b = data["b"]; 
    }, 
    dataType: "json" 
}); 

// do "asynchronous" things here 

$.ajaxComplete(function() { 
    // do stuff now that call is complete 
}); 

もう1つの方法は、ajaxメソッドの完全なプロパティを使用することです。

var a, 
b; 

$.ajax({ 
    type: "POST", 
    url: "test.php", 
    data: {getvar: "getvar"}, 
    success: function(data) { 
     a = data["a"]; 
     b = data["b"]; 
    }, 
    complete: function(data) { 
     // do stuff now that call is complete 
    }, 
    dataType: "json" 
}); 

// do "asynchronous" things here 
+0

私の例を参照するとどうなりますか? 'function somename()'を除いて '$(document).ajaxComplete(function(){});の中にすべてを入れますか?これは '$(document).ready(function(){});の中のjq関数のために保存されますか? – soonic

+0

本当にあなたがしようとしていることに依存します。ページの一部をすぐに表示し、完了したら残りのページを表示し、関数を呼び出してデータを入力することができます。 ajaxComplete()の内部でajax呼び出しが完了することなく中断するものはすべて入れてください。 –

+0

スクリプト内の他のajax呼び出しについては、このajaxCompleteがこの例でのみ参照する必要があることを区別する方法は? – soonic

0
// we put a and b in global scope 
var a, b; 

// we delay ready event 
$.holdReady(true); 

$.post(
    "test.php", 
    {getvar: "getvar"}, 
    function(data) { 
     funget(data);  
    }, 
    "json" 
); 

var funget = function(param) { 
    // since defined in global scopes, we will be able to access them from everywhere 
    a = param["a"]; 
    b = param["b"]; 

    // we release ready event 
    $.holdReady(false); 
} 

https://api.jquery.com/jquery.holdready/

私はより良く理解するためにあなたの例に近いものを使用。しかし、ajaxリクエストの完全なコールバックが簡単であることは事実です。 holdReadyはこの場合実際には悪いデザインを示唆しています。

+0

返信ありがとうございます。私のテストがajaxを使って失敗するかどうかを確認します。 – soonic

+0

実際、準備ができているイベントが遅れているのを見ていませんでした。私はこれに合わせていくつかの簡単な変更を行いました。それにもかかわらず、もう一つの答えは、私のために行く方法です。 –

関連する問題