Throttle在AngularJS中的承诺

Throttle promises in AngularJS

本文关键字:承诺 AngularJS Throttle      更新时间:2023-09-26

我有一个web应用程序,它允许用户通过文件输入选择多个文件。一旦用户选择了这些文件,我就通过我剩下的API一个接一个地上传这些文件。然而,在IE中,如果用户一次选择了很多文件(>10),IE将随机中止一些请求(之前发布了一个问题,但此处没有回应)。我能想到的解决这个问题的唯一方法就是限制这些http请求。

例如,如果一个用户选择了20个文件,我想一次激发其中的5个。完成所有5个承诺后,从下一组5个开始。有办法做到这一点吗?

是的,使用promise是可能的。在我的es6 promise模式存储库中,我有一个函数示例可以帮助实现这一点,位于https://github.com/DukeyToo/es6-promise-patterns#resource-限制器。不幸的是,我没有为$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的实现很棘手。