我有数组(f.e. )它是文件的队列):
[{deferred: fileDef, data: file}, {...}, ...]每个fileDef和文件发送到上传函数,该函数返回fileDef.promise并在上传后调用fileDef.resolve或fileDef.reject。
我想上传文件的顺序:下一个文件上传后,上一个文件被加载。
现在我用
var queue = [];
var uploading = false;
//file input callback call each time the user selects files
function addAndUpload (file) {
queue.push({deferred: $q.defer(), data: file});
if (!uploading) recurceQueue();
function recurceQueue () {
if (queue.length) {
uploading = true;
var fileObj = queue.shift();
upload(fileObj.deferred, fileObj.data);
fileObj.deferred.promise.finally(function () {
uploading = false;
recurceQueue();
})
}
}
}但这似乎很糟糕。如何写得更好?
发布于 2013-09-23 06:06:38
不要使用队列和布尔标志,只有一个变量存储表示所有上传的承诺。另外,您的upload函数不应该将延迟对象作为参数进行解析,而应该简单地返回一个新的承诺。
然后,addAnUpload就变得像
var allUploads = $q.when(); // init with resolved promise
function AddAnUpload(file) {
allUploads = allUploads.then(function() {
return upload(file);
});
}有了闭包,您不再需要queue来存储等待上传的内容了。如果您希望allUploads始终履行,即使一个upload失败了,您也需要从then-callback返回一个始终满足的承诺:
return upload(file).then(null, function(err) {
console.log(err, "does not matter");
}); // fulfills with undefined in error casehttps://stackoverflow.com/questions/18943024
复制相似问题