2013-03-12 3 views
0

Попытка использовать $ .Deferreds вместо setTimeOut, который я использовал ранее. У меня проблема, поскольку writer() на самом деле не выполняется, потому что $ .each по-прежнему зацикливаются в то время, когда вызывается print().

Я еще не видел пример $ .Deferreds с циклами. Очевидно, что нижеследующее неверно, и я уверен, что это связано с решением - любая помощь будет оценена по достоинству.

$.when(writer()).done(function() { 
    printer(); 
}); 


function writer(){ 
    var deferred = new $.Deferred(); 
    if(x){ 
     $("a").each(function() {...}); 
    } 
    if(y){ 
     $("img").each(function() {...}); 
    } 
    if(z){ 
     $("div").each(function() {...}); 
    } 
    deferred.resolve(); 
    return deferred.promise(); 

} 

function printer(){...} 
+0

Подумайте об этом, вы всегда его разрешения, прежде чем вернуть его, так что '.done' всегда будет происходить сразу после вызова 'writer', независимо от того, выполняются ли какие-либо асинхронные события внутри вашего' .each'. Если вы не выполняете асинхронную работу внутри '$ .each', вам не нужны отложенные объекты. –

+0

@KevinB - это именно то, что я понял, просто не уверен, как вернуть несколько отложенных до запуска принтера() – Jason

+0

Несвязанный, но почему вы вызываете '.each()' на объект jQuery, который будет содержать только максимум один элемент? –

ответ

0

Предполагая ... внутри из .each делает асинхронное событие, вам нужны все эти асинхронные события вернуть отложенный объект, который можно передать в $.when, чтобы вызвать вашу решимость.

Кроме того, в верхней части кода, вам не нужно $.when для одного обратного вызова, просто сделать writer().done(function(){...})

+0

см. Обновленный - $ .each завернут в if - так, как вернуть отложенную в $ .each и гарантировать, что все возвращены, которые верны? – Jason