javascript jquery deferred not working with worker? -
i have following javascript code:
var promises = []; // entries contains unknown amount of items. sake of // sample, has five. $.each(entries, function() { promises.push(doprocessing()); }); return $.when.apply($, promises).done(function() { alert('success'); }).fail(function() { alert('failed'); });
if doprocessing
function is:
function doprocessing() { var def = $.deferred(); settimeout(function () { console.log('request completed'); def.resolve(); },2000); return def.promise(); } // end of doprocessing
i request completed
log 5 times, followed 'success' alert. if change doprocessing method be:
function doprocessing() { var def = $.deferred(); // worker has message myworker.onmessage = function(event) { console.log('worker finished'); def.resolve(); console.log(def); }; myworker.postmessage({action:'dosomething'}); return def.promise(); } // end of doprocessing
where worker doing processing , resolving deferred, no longer success
alert. 5 worker finished
messages, , def object logged out.
i'm not sure i'm doing wrong here. point me in right direction?
i 5 worker finished messages, , def object logged out.
but it's same def
object. by
myworker.onmessage = function(event) { … }
you overwriting .onmessage
property, , last listener called - 5 events. instead, like
worker.messages = 0; function doprocessing() { var def = $.deferred(), id = worker.messages++; // worker has message myworker.addeventlistener("message", function l(event) { if (event.data.id != id) return; // it's not us! console.log('worker '+id+' finished'); def.resolve(event.data); worker.removeeventlistener(l); }); myworker.postmessage({action:'dosomething', id:id}); return def.promise(); }
and adapt worker code pass id
back.
Comments
Post a Comment