AngularJS中的节流承诺

时间:2016-04-29 21:49:28

标签: javascript angularjs internet-explorer

我有一个网络应用程序,允许用户通过文件输入选择多个文件。一旦用户选择了文件,我就会通过我的其余API逐个上传这些文件。然而,在IE中,如果用户一次选择大量文件(> 10),则IE将随机中止一些请求(之前发布的问题没有响应here)。我能想到解决这个问题的唯一方法是限制这些http请求。

例如,如果用户选择了20个文件,我想一次启动5个文件。完成所有5个承诺后,从下一组5开始。任何方法都可以这样做吗?

1 个答案:

答案 0 :(得分:0)

是的,可以使用promises。我有一个函数示例,可帮助我在https://github.com/DukeyToo/es6-promise-patterns#resource-limiter的es6 promise模式存储库中执行此操作。不幸的是,我没有为$q编写的版本,但翻译起来应该不太难:)

在您的示例中,它将使用类似这样的内容:

var limiter = resourceLimiter(5);
for (var i=0; i<20; i++) {
  limiter.take().then(function() {
    return $http({..do your request .})
  }.then(function(response) {
    limiter.give();
    //.. then do whatever with response
  });
}

基本上,.take在资源可用时解析,并使用5种资源中的一种。 .give会返回资源,并触发下一个.take来解析。虽然resourceLimiter实现很棘手,但这个概念很简单。