不是作为 jQuery Deferred 执行的异步函数

2024-03-08

假设我想以同步方式处理一些任务,所以我有这个函数:

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,则notify将不起作用。 如果我将 processWrongFileType 更改为如下所示:

function processWrongFileType()
{
    var dfd = new jQuery.Deferred();
    setTimeout(function(){dfd.resolve();},1);
    return dfd.promise();
}

通知()将起作用。有没有什么方法可以避免 setTimeout 并且仍然让 notification() 处理进度事件?


您无需执行任何特殊操作即可将同步代码用作承诺。

只是返回值==true

$.when((function() {
    return prompt('really?')
})()).then((function() { 
    return alert('yeah') 
})()).done((function () { 
    alert('done') 
})())
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

不是作为 jQuery Deferred 执行的异步函数 的相关文章

随机推荐