我有一个网络应用程序,允许用户通过文件输入选择多个文件。一旦用户选择了文件,我就会通过我的其余API逐个上传这些文件。然而,在IE中,如果用户一次选择大量文件(> 10),则IE将随机中止一些请求(之前发布的问题没有响应here)。我能想到解决这个问题的唯一方法是限制这些http请求。
例如,如果用户选择了20个文件,我想一次启动5个文件。完成所有5个承诺后,从下一组5开始。任何方法都可以这样做吗?
答案 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
实现很棘手,但这个概念很简单。