2012-08-11 10 views
25
function ajax_test(str1){ 
    var url = "None" 
    jq.ajax({ 
    type:'post', 
    cache: false, 
    url: 'http://....' + str1, 
    success: function(data, status, xhr){ 
     url=data; 
    }, 
    error: function (xhr, status, e) { 
    }, 
    async: true, 
    dataType: 'json' 
    }); 
    return url 
} 
ben iade başarı ajax veri olarak küresel değişkeni url ayarlayabilirsiniz nasıl

? JavaScript injquery ajax çağrı başarısı, sarıcı javascript işlevindeki genel bir değişkeni nasıl değiştirebilirim?

+0

Sadece bir kez başarı atıldığında 'url 'ile bir şeyler yapmalısınız? – NicoSantangelo

+0

Küresel değil çünkü önündeki anahtar kelime var. Bence dış kapsamı kastediyorsun. – maximus

+0

Hızlı yanıtlar için teşekkürler! @maximus evet dış kapsamı kastettim. Geçerli bir URL’m var, detay bölümünü çıkardım. – sammiwei

cevap

24

, bu return zaman uyumsuz bir sonuç için bir işlev için imkansızdır. İşlev, AJAX isteği bile yapılmadan önce genellikle geri döner.

Her zaman isteğinizi async: false ile senkronize olmak için zorlayabilirsiniz, ancak bu genellikle iyi bir fikir değildir, çünkü sonuçların beklenirken tarayıcının kilitlenmesine neden olur. Bunu aşmanın

standart yolu bir geri çağırma işlevi kullanmaktır.

ajax_test("str", function(url) { 
    //do something with url 
}); 
+0

Bu, OP'nin özel olarak sorduğu şey olmayabilir, ancak işlerin yapılması için doğru yoldur. +1 –

+0

İlk 2 paragrafınızda bazı çelişkiler var. Eşzamansız bir sonuç döndürmek imkansızdır [ikinci paragrafınızda açıklandığı gibi kesinlikle gerekli olmadıkça kaçınılması gereken 'async: false' kullanılmadıkça]. Yeterince iyi açıklanmış. –

+0

@ FabrícioMatté Hayır, bu bir çelişki değil çünkü "async: false" kullanırsanız, artık eşzamansız değildir. –

2

İşte php verilerin çekilmesi için benim kod örneği ve ardından ajax başarı işlevi içinde bir javascript küresel değeri değişkene aktarmak:

function ajax_test(str1, callback){ 
    jq.ajax({ 
    //... your options 
    success: function(data, status, xhr){ 
     callback(data); 
    } 
    }); 
} 

ve sonra böyle diyebilirsin. Benim için çalışıyor!

var retVal = null; 

function ajaxCallBack(retString){ 
    retVal = retString; 
} 

function readString(filename){ 
    $.ajax({ 
     type: "POST", 
     url: "readString.php", 
     data: { 'fn': filename },  
     success: function(response){ 
      ajaxCallBack(response); 
     } 
    }); 
} 

PHP kodu (readString.php): Ancak

<?php 

    $fn = $_POST['fn']; 

    $file = fopen("path/".$fn.".record","r"); 
    $string = fread($file,filesize("path/".$fn.".record")); 
    fclose($file); 

    echo $string; 
?> 

, bu başarı geri arama çalışmadan önce döndürebilir anlamına gelir uyumsuz istekleri gönderilen $ .ajax() gibi, sen güvenmemelisiniz sırayla çalışır ve değeri kendi başına döndürür. Bu nedenle, burada geri arama işlevinde php yanıt değerini global değere atarız.

İlgili konular