我有一个函数通过在列表中的每个文件上调用单个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"); }); }