2016-03-23 9 views
0

Birinin bana yardımcı olabileceğini umduğum js sözleriyle ilgili bir sorunum var. Aşağıdaki fonksiyonum, $ .ajax bir çağrı gerçekleştirir ve bu nedenle bir söz verir. Bu fonksiyon güncellemeler ben Recurse olarak bu tazelenmiş div göstermek için tarayıcıya geri kontrol el gerekir gibi, aşağıdaki gibi bir setTimeout çağırıyorum:

var nextBitOfWork = function() { 
    return myFunction(email); 
}; 
setTimeout(nextBitOfWork, 0); 

(recurses) myFunction artık döndürür nerede bittiğinde söz veriyorum. $ .ajax çağrısı. söz geçirilir ve tüm sözler yakalanır, yukarıda inşa setTimeout fonksiyonu olmadan

return myFunction(email); 

ve bana ihtiyacım olan dizi çıktı almak için izin ve her şey zaman özyinelemeye iyi çalışıyor: Ben sadece

çağırırsanız biter. Ancak setTimeout olmadan tarayıcıyı yenilemiyorum. Yukarıdaki gibi kullanarak div güncelleme yenilemeyi görüntüleyebilirim, ancak sözünü kaybediyor gibi görünüyor ve bu yüzden script devam ediyor ve myFunction'ın yeniden oluşturduğu diziyi doldurmaya çalışmıyorum.

SetTimeout'un güvenilir bir şekilde söz verdiğinden emin olmak için, yanıt dizisini oluşturup div güncellemelerini görüntülediğim gibi herhangi bir düşünce var mı?

Yardımlarınız için şimdiden teşekkürler! tarayıcı div vermektedir rağmen, dizi topladığım için myFunction ile inşa -

function refreshscreen(func,time) { 
    var timer = $.Deferred(); 
    setTimeout(function() { 
     return func().then(timer.resolve()); 
    }, time); 
    return timer.promise(); 
} 
Hala

aynı sorunu:

refreshscreen olan
var func = function() { 
    myFunction(email); 
}; 
return refreshscreen(func,0); 

: -

Tamam şimdi aşağıdaki var $ .ajax yanıtları sadece 1 element uzunluğundadır - 20 kere geri çekilse de! Ekranı yenilemek için çağrı yapılmadan dizi iyi bir şekilde oluşturulur, ancak tarayıcı, tekrarlamadıkça div’u asla oluşturmaz!

+1

Taleplerin sıraya konması yerine (daha sonra, gerekirse) geri çağrıları kullanma hakkında ne düşünüyorsunuz? – briosheje

+0

Çok büyük bir kodun yeniden yazılması anlamına gelir - bunun vaatlerle mümkün olduğunu bildiğinizden emin olun, ancak bunları işlemek için nasıl yapılandıracağınızdan emin değilsiniz! –

+0

Düzenlemede 'func'' MyFunction'dan alınan sözü geri vermelidir. (Ayrıca "setTimeout" içindeki dönüşü de kaldırabilirsiniz) – csum

cevap

1

setTimeout yönteme geçen işlevi tarafından döndürülen değer döndürmez. Döndürülen değeri almak Yani sırayla

(Size clearTimeout kadar içeri geçerek zaman aşımını durdurmak için kullanabileceğiniz bir değer döndürür) myFunction'dan sadece setTimeout için çağrınızdaki bir işleve sarın.

setTimeout(function() { 
    var promise = myFunction(email); 
    // do something with promise... 
}, 0); 
+0

Faydalı @csum - teşekkürler! –

İlgili konular