mno*_*tka 12 javascript jquery deferred jquery-deferred
让我说我想以同步方式处理一些任务,所以我有这个功能:
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;
}
Run Code Online (Sandbox Code Playgroud)
现在我可以用它来处理一些文件:
_.each(fileList, function(element, index, list){
_.each(element, function(el, idx, lst){
promisesQueue.push({funct: processFile, argmnt:[el, index + (len - fileList.length) ,len]});
});
});
Run Code Online (Sandbox Code Playgroud)
执行它并指出进度:
executePromiseQueueSync(promisesQueue).then(function(){
....
}, function(){
....
}).progress(function(msg, progress, name, index, status, desc){
console.log('progress');
});
Run Code Online (Sandbox Code Playgroud)
流程函数本身如下所示:
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();
}
Run Code Online (Sandbox Code Playgroud)
如您所见,当文件类型错误时,没有什么可做的:
所以有时我想像承诺一样执行同步代码:
function processWrongFileType(){
var dfd = new jQuery.Deferred();
dfd.resolve();
console.log("blah");
return dfd.promise();
}
Run Code Online (Sandbox Code Playgroud)
问题是如果将执行processWrongFileType,则通知将不起作用.如果我将processWrongFileType更改为如下所示:
function processWrongFileType()
{
var dfd = new jQuery.Deferred();
setTimeout(function(){dfd.resolve();},1);
return dfd.promise();
}
Run Code Online (Sandbox Code Playgroud)
notify()将起作用.有没有办法避免使用setTimeout并仍然使用notify()处理进度事件?
您无需执行任何特殊操作即可将同步代码用作承诺。
只是返回值 ==true
$.when((function() {
return prompt('really?')
})()).then((function() {
return alert('yeah')
})()).done((function () {
alert('done')
})())
Run Code Online (Sandbox Code Playgroud)