2013-04-05 3 views
12

Допустим, я хочу, чтобы обработать некоторые задачи в синхронном режиме, так что я эту функцию:не асинхронная функция выполняется как 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 и все еще уведомлять() о работе с событием прогресса?

+0

Вы можете показать более полный пример вашего $ .Когда с помощью й? –

+2

Что вы делаете, должно работать ... http://jsfiddle.net/3XD9v/ Я предполагаю, что причина, по которой он не работает для вас, связан с тем, как вы комбинируете фрагменты выше или код вокруг него. –

+4

Зачем вам это решать, прежде чем возвращать обещание? Вы уверены, что не просто ищете функцию обратного вызова, так как это не имеет для меня никакого смысла? – adeneo

ответ

1

Вам не нужно ничего делать, чтобы использовать код синхронизации в качестве обещания.

значения Просто возвращение этого ==true

$.when((function() { 
    return prompt('really?') 
})()).then((function() { 
    return alert('yeah') 
})()).done((function() { 
    alert('done') 
})()) 
Смежные вопросы