2016-04-01 13 views
0

Sadece "removeDocx" işlevi yürütüldüğünde sayfayı güncellemek istiyorum. Ama benim durumumda, zamanlayıcının zaman aşımı, "wait" işlevinin tamamlanması olarak algılanıyor. Sorun nerede ve nasıl çözebilirim?Neden .when() işlev tamamlandığında beklemez?

$(function() { 
    $.when(wait()).done(function() { 
     location.href = location.href; 
    }); 
}); 
function wait() { 
    var pm = { ISN_DOC: GetrcId(document.location.href) }; 
    if (isNaN(pm.ISN_DOC)) 
     setTimeout(wait, 500); 
    else removeDocx(); 
} 
function removeDocx() { 
    var def = $.Deferred(); 
    var url = "MinPrj/Collage.asmx/clearPattern?isn_doc=" + pm.ISN_DOC; 
    $.ajax({ 
     type: 'POST', 
     url: rootpath + url, 
     contentType: 'application/json' 
    }).done(function (r) { 
     def.resolve(); 
    }).fail(def.reject()); 
    return def; 
} 
+0

Hemen "wait()" yi çağırıyorsunuz ve dönüş değerini "$ .when" değerine iletiyorsunuz. 'Bekle' bir şey döndürmediğinden, nasıl çalışmasını bekliyorsunuz? –

+0

'$ .ajax' için' data' argümanınız yok. İçeriğiniz olmadığında, neden bir içerik türü olan "application/json" ayarlıyorsunuz? – Quentin

cevap

1

Her şeyden önce removeDocx işlevini düzeltin. $.ajax zaten ertelenmiş nesneyi döndürür:

function removeDocx() { 
    var url = "MinPrj/Collage.asmx/clearPattern?isn_doc=" + pm.ISN_DOC; 
    return $.ajax({ 
     type: 'POST', 
     url: rootpath + url, 
     contentType: 'application/json' 
    }); 
} 

Şimdi wait fonksiyonu (o $.when çalışmak için) hem de ertelenmiş dönmek zorundadır. Sorun şu ki, farklı (sözde-yinelemeli) aramalar arasındaki durumu wait'a bildirmeniz gerekiyor. , Eskisi gibi

function wait(def) { 
    if (!def) { 
     var def = $.Deferred(); 
    } 
    var pm = { ISN_DOC: GetrcId(document.location.href) }; 
    if (isNaN(pm.ISN_DOC)) { 
     setTimeout(function() { 
      wait(def); 
     }, 500); 
    } else { 
     $.when(removeDocx()).then(def.resolve); 
    } 
    return def; 
} 

kodun kalan kalır yani oturum args olmadan wait() çağırır: Böyle bir şey işe yarayabilir.

+0

Teşekkürler. İşe yarıyor! Ertelenmiş nesneyi kullanmak daha açıktı. –

+0

Fakat bu doğru değil. Bunun yerine location.href = location.href; location.reload() yazın; - Sonsuz bir döngü var. Ve bu işlevin uygulanmasını projenin düğmesine basarak yapılandıramıyorum. –

2

the documentation: From:

jQuery.when(deferreds)
deferreds
Tipi: Ertelenmiş
Sıfır veya daha fazla Ertelenmiş nesneler veya JavaScript nesneleri düz bir kod örneği yoktur. Normal bir işlev, bu yüzden bir Ertelenmiş nesne geçiyoruz

...

tek argüman jQuery.when (geçirilen) ve tersi geçerli ise bir Ertelenmiş Veya bir Promise, öyle olacak çözülmüş ertelenmiş olarak ele alınır ve ekli tüm Geri Döngüler derhal icra edilir.

+0

Cevabınız için teşekkürler. Bana yardım ettin. –