以编程方式创建jQuery承诺的链式序列

前端之家收集整理的这篇文章主要介绍了以编程方式创建jQuery承诺的链式序列前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个函数通过在列表中的每个文件调用单个deleteFile(filePath)来删除列表中的文件数组filePaths(我正在使用的一些APIS不支持批量删除).函数deleteFile返回jQuery promise并在删除文件时解析/拒绝.
function deleteFiles(filePaths)
    var deferreds = $.map(fileKeys,function (val,index) {
        return deleteFile(filePath);
    });

    $.when.apply($,deferreds).then(function (schemas) {
        console.log("DONE",this,schemas);
        deferred.resolve();
    },function (error) {
        console.log("My ajax Failed");
        deferred.reject(error);
    });

我得到.reject调用列表中的一些文件(我知道它们存在),所以我想我可能需要将filePaths数组变成一个链接调用,比如一个队列(b / c这个不是什么$.什么,是吗?它似乎立刻启动它们).我知道如何做到这一点(如.deleteFile(path1).deletePath(path2)等等,当它们在这样的数组中时.

任何帮助都提前得到赞赏.

解决方法

$.when没有启动任何东西,它们是在你的地图循环中启动的. $.when只返回一个promises数组的promise.

如果你想按顺序使用它们,请使用reduce:

function deleteFiles(filePaths) {
    return filePaths.reduce(function(cur,next) {
         return cur.then(function() {
             return deleteFile(next);
         });
    },$().promise());
}

如果您按顺序想要它们,同时还要使用相应的结果返回数组:

function deleteFiles(filePaths) {
    var ret = filePaths.slice(0);
    return filePaths.reduce(function(cur,next,i) {
         return cur.then(function() {
             return ret[i] = deleteFile(next);
         });
    },$().promise()).then(function(){
         return $.when.apply($,ret);
    })
    //These don't make any sense to call in this function but sure
    .then(function(schemas) {
         console.log("DONE",schemas);
    }).fail(function(error) {
         console.log("My ajax Failed");
    });
}

猜你在找的jQuery相关文章