Допустим, я хочу, чтобы обработать некоторые задачи в синхронном режиме, так что я эту функцию:не асинхронная функция выполняется как JQuery Отложенный
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();
}
уведомит() будет работать. Есть ли способ избежать setTimeout и все еще уведомлять() о работе с событием прогресса?
Вы можете показать более полный пример вашего $ .Когда с помощью й? –
Что вы делаете, должно работать ... http://jsfiddle.net/3XD9v/ Я предполагаю, что причина, по которой он не работает для вас, связан с тем, как вы комбинируете фрагменты выше или код вокруг него. –
Зачем вам это решать, прежде чем возвращать обещание? Вы уверены, что не просто ищете функцию обратного вызова, так как это не имеет для меня никакого смысла? – adeneo