不是作为jQuery Deferred执行的异步函数
假设我想以同步方式处理一些任务,所以我有这个function:
function executePromiseQueueSync(queue){ var seed = $.Deferred(), finalPromise; finalPromise = _.reduce(queue, function(memo, promise){ return memo.then(function(){ return promise.funct.apply(null, promise.argmnt); }); }, seed.promise()); seed.resolve(); return finalPromise; }
现在我可以用它来处理一些文件:
_.each(fileList, function(element, index, list){ _.each(element, function(el, idx, lst){ promisesQueue.push({funct: processFile, argmnt:[el, index + (len - fileList.length) ,len]}); }); });
执行它并指出进度:
executePromiseQueueSync(promisesQueue).then(function(){ .... }, function(){ .... }).progress(function(msg, progress, name, index, status, desc){ console.log('progress'); });
流程函数本身如下所示:
function processFile(file, index, size) { var dfd = new jQuery.Deferred(); if (file.name.match('(.*)\\.jpg')) ... else if ... else $.when(processWrongFileType(file)).then(function(){ dfd.notify(...); dfd.resolve(); }); return dfd.promise(); }
如您所见,当文件类型错误时,没有什么可做的:
所以有时我想像承诺一样执行同步代码:
function processWrongFileType(){ var dfd = new jQuery.Deferred(); dfd.resolve(); console.log("blah"); return dfd.promise(); }
问题是如果将执行processWrongFileType,则通知将不起作用。 如果我将processWrongFileType更改为如下所示:
function processWrongFileType() { var dfd = new jQuery.Deferred(); setTimeout(function(){dfd.resolve();},1); return dfd.promise(); }
notify()将起作用。 有没有办法避免使用setTimeout并仍然使用notify()处理进度事件?
你不需要做任何特殊的事情来使用同步代码作为承诺。
只返回值==true
$.when((function() { return prompt('really?') })()).then((function() { return alert('yeah') })()).done((function () { alert('done') })())