首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AngularJS $q.延迟队列

AngularJS $q.延迟队列
EN

Stack Overflow用户
提问于 2013-09-22 10:50:02
回答 1查看 5.7K关注 0票数 9

我有数组(f.e. )它是文件的队列):

代码语言:javascript
复制
[{deferred: fileDef, data: file}, {...}, ...]

每个fileDef和文件发送到上传函数,该函数返回fileDef.promise并在上传后调用fileDef.resolve或fileDef.reject。

我想上传文件的顺序:下一个文件上传后,上一个文件被加载。

现在我用

代码语言:javascript
复制
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();
      })
    }
  }
}

但这似乎很糟糕。如何写得更好?

EN

回答 1

Stack Overflow用户

发布于 2013-09-23 06:06:38

不要使用队列和布尔标志,只有一个变量存储表示所有上传的承诺。另外,您的upload函数不应该将延迟对象作为参数进行解析,而应该简单地返回一个新的承诺。

然后,addAnUpload就变得像

代码语言:javascript
复制
var allUploads = $q.when(); // init with resolved promise

function AddAnUpload(file) {
    allUploads = allUploads.then(function() {
        return upload(file);
    });
}

有了闭包,您不再需要queue来存储等待上传的内容了。如果您希望allUploads始终履行,即使一个upload失败了,您也需要从then-callback返回一个始终满足的承诺:

代码语言:javascript
复制
        return upload(file).then(null, function(err) {
            console.log(err, "does not matter");
        }); // fulfills with undefined in error case
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18943024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档