不是作为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') })())