Bu soru burada zaten bir cevabı var:
Eğer eş zamanlı çalıştırmak için bunu söylemek ne zaman çalışmıyor nedeni değişkeni 'çıktı' sadece arama fonksiyonu kapsamında tanımlanmış olmasıdır.
Orada yapmak için çalışıyoruz ne yapmak için daha iyi bir yolu, neredeyse kesinlikle, ama daha bağlamında olmadan, o ne olabileceğini açıklamak için zor olacak.
Ben "javascript değişken kapsamında" üzerinde okuma tavsiye ederim
JavaScript işlev kapsamı vardır ben kapsamını engellemek değil, senin sorunun sorunları kapsam bekliyoruz olmaz. Bir işlevin herhangi bir yerinde bildirilen değişkenler işlevi başka bir yerde bulunmaktadır. Fonksiyonel olarak önemli değil, çünkü, ancak sizin değişkenler mevcut olduğunu hatırlatmak çünkü as though ne olursa olsun üstünde ilan edildi: JSLint üst onları bildirmek için sizi rahatsız Bu yüzden aslında onları beyan nerede. Bu basit örnekte deneyin:
function ajax(callback) { callback(); }
$(function() {
ajax(function() { x = 7; });
alert(x); // x == 7
});
Sorun, $.post
çağrı uyumsuz olmasıdır. Sen satırından önce satır return output;
zorluyorsun output = data;
. Potansiyel olarak yavaş bir AJAX çağrısı olur ise $.post
, hemen döner ve program devam etmek için izin verir, çünkü bu olur. AJAX arama tamamlandığında, onun complete
geri arama patlar.
Eğer $.post
için geçiyoruz geri arama işlevi içinde senin değere sahip bir şey yapıyoruz, böylece kodunuzu yeniden gerekir. Sen bir callback parametresi ileterek bunu gerçekleştirmek get_rsrce_name()
olabilir:
function get_rsrce_name(onComplete) {
$.post( url, data, function(data) { onComplete(data); });
}
. jQuery sonrası () uyumsuz çalışan yöntem varsayılan, yani: sonrası () işlevi durdurmak ve cevap beklemez, sadece hemen döner ve script kalanı itibaren devam eder. Bu durumda, sizin return
tablosuna itibaren devam eder.
Ve şimdi ... klasik bir yarış durumu aşağı AJAX isteği tam olabilir konum VE senaryonun kalanı dönüş çağrısı itibaren devam etmeden önce function ( data )
yürütmek? Verilen en ağları milisaniye cinsinden ölçülen gecikmeleri var ve geri arama sonra, büyük olasılıkla ... dönüş çağrısı yarışalım her zaman kazanacak değil sadece mikrosaniye idam edilecek.
Bu AJAX isteği çağrılması dış işlev AJAX isteği sonuçları ile tekrar çağrılabilir böylece kodunuzu yeniden düzenlemek gerekir.
Bunu yapmak için basit bir yöntem, bir iki parça fonksiyonu yapmak için:
function do_ajax(parameters, data) {
if (data == null) {
jquery.post(
....
success: function(data) { do_ajax(parameters, data); }
);
} else {
... handle response here ...
}
}
Bu şekilde, fonksiyonu (parameters
) AJAX çağrısına geçmek için gereken her türlü veri ile çağrılabilir, ve data
parametresi başlangıçta null. Fonksiyonu verileri boş olduğunu görür ve AJAX şeyler yapar. Sunucudan yanıt geri geliyor sonra, fonksiyon tekrar kendini çağırır, ancak tepki verileri ile sağlanan ve verileri işleme fonksiyonunun diğer kısmı denir.