jQuery: Eşzamanlı AJAX isteklerini gerçekleştirme


187

Geçmişte bazı jQuery yaptım, ama tamamen bu konuda takılıp kaldım. Eşzamanlı ajax çağrılarını kullanmanın artılarını ve eksilerini biliyorum, ama burada gerekli olacak.

Uzak sayfa yüklenir (kundakçı ile kontrol edilir), ancak geri dönüş gösterilmez.

İşlevimin düzgün bir şekilde geri dönmesini sağlamak için farklı ne yapmalıyım?

function getRemote() {

    var remote;

    $.ajax({
        type: "GET",
        url: remote_url,
        async: false,
        success : function(data) {
            remote = data;
        }
    });

    return remote;

}

Kod iyi görünüyor. ne geri dönüyor? Herhangi bir js hatası var mı?
ShankarSangoli

11
Oldukça ironik buluyorum - Eşzamanlı olarak "Eşzamansız JavaScript ve XML" işlemini nasıl yapacağınızı soruyorsunuz. Gerçekten yapmanız gereken bir "SJAX".
VitalyB

3
Not: spec senkron AJAX isteklerini kullanımdan kaldırmaya başladı.
Léo Lam

2
"[eşzamanlı] gerekli olacak" ifadesinin JavaScript motorlarının anlaşılamaması, dolayısıyla kötü tasarlanmış bir uygulama olduğu anlaşılıyor. Senkronizasyonun gerçekten gerekli olduğu durumlar olup olmadığını anlamak istiyorum.
pmont

15
@pmont seems that the statement "[synchronous] will be required" indicates a lack of understanding of JavaScript engines, thus a poorly architected app.Veya çok iyi bir anlayış: Bir AJAX çağrısı yapmak istiyorsanız onbeforeunload, senkronize bir istek kullanmak aslında önerilen yoldur (tarayıcı penceresi, istek aksi belirtilmedikçe gider). Herhangi bir şekilde `` Eşzamanlı ajax çağrılarını kullanmanın artılarını ve eksilerini biliyorum '' diyor ... Belki ona inanıyor musun?
Stijn de Witt

Yanıtlar:


298

Senkronize bir istekte bulunduğunuzda,

function getRemote() {
    return $.ajax({
        type: "GET",
        url: remote_url,
        async: false
    }).responseText;
}

Örnek - http://api.jquery.com/jQuery.ajax/#example-3

LÜTFEN DİKKAT: Eşzamansız özelliğini false olarak ayarlamak kullanımdan kaldırılmıştır ve kaldırılma sürecinde ( bağlantı ). Firefox ve Chrome gibi birçok tarayıcı, bunu kullanırsanız konsolda bir uyarı yazdırmaya zaten başladı:

Krom:

Ana iş parçasındaki zaman uyumlu XMLHttpRequest, son kullanıcının deneyimine zararlı etkileri nedeniyle kullanımdan kaldırılmıştır. Daha fazla yardım için https://xhr.spec.whatwg.org/ adresini ziyaret edin .

Firefox:

Ana iş parçasındaki zaman uyumlu XMLHttpRequest, son kullanıcının deneyimine zararlı etkileri nedeniyle kullanımdan kaldırılmıştır. Daha fazla yardım için http://xhr.spec.whatwg.org/


16
responseTextHer zaman bir dize döndürdüğünü unutmayın . Eğer JSON bekliyoruz, sarın $.ajaxile JSON.parse.
usandfriends

6
Not: xhr.spec.whatwg.org/#the-open()-method Senkron istekleri kullanımdan kaldırılmıştır ...
teynon

5
@Tom Ve böylece vardı <i>ve <b>etiketleri. Benim tavsiyem: bu özellikleri kullanmaya devam etmeleri için bu özellikleri kullanmaya devam edin.
Stijn de Witt

1
Bu tarayıcıyı kilitlediğinden, seçeneklere 5000 veya daha fazla zaman aşımı eklemek mantıklıdır.
commonpike

1
nesneye ayrıştırma dize için @usandfriends yerine JSON.parse ait jQuery.parseJSON kullanmak daha güvenli olduğunu stackoverflow.com/questions/10362277/...
Antone

33

Ajax işlevini yanlış kullanıyorsunuz. Eşzamanlı olduğu için verileri şu şekilde satır içinde döndürür:

var remote = $.ajax({
    type: "GET",
    url: remote_url,
    async: false
}).responseText;

17

bu url ne kadar uzak? aynı alan adından mı? kod iyi görünüyor

bunu dene

$.ajaxSetup({async:false});
$.get(remote_url, function(data) { remote = data; });
// or
remote = $.get(remote_url).responseText;

Evet! Aynı alan ve her şey. remote_urlifadesi düzgün bir şekilde tanımlanır ve AJAX çağrısı, belirtildiği gibi (ateş böceği ile kontrol edilir) düzgün şekilde gerçekleştirilir. Sadece geri dönüş yok!
Endüstriyel

3
function getRemote() {
    return $.ajax({
        type: "GET",
        url: remote_url,
        async: false,
        success: function (result) {
            /* if result is a JSon object */
            if (result.valid)
                return true;
            else
                return false;
        }
    });
}

7
Lütfen bunun OP'ye neden yardımcı olacağına dair bazı açıklamalar ekleyin.
krillgar

Sunucu tarafından bir json nesnesi döndürmek iyi bir uygulamadır. Size daha fazla kontrol sağlar. Ancak, yukarıdaki $ .ajax parametrelerine dataType: "json" eklemeniz gerekir.
jjwdesign

Bu ne anlama geliyor: "Size daha fazla kontrol sağlıyor" mu?
grantwparks

3
İlişkili değil ancak şunları yapabilirsiniz: return sonuç.valid; // Bu zaten bir boole
dpineda
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.