一个接一个地制作Angular $ http服务进程结果

时间:2018-04-03 08:49:15

标签: angularjs promise angular-promise

我有一个非常大的angularjs应用程序,销售东西并有过滤器

似乎我们需要通过不稳定的联系来支持人们。

这意味着如果用户选择“二手产品”过滤器,然后他取消选择“二手产品”,则会通过$ http向服务器发出两次调用。

$http.get("reloadresults?used=true", function (response)  { $scope.items = response items; }); at 12:03:04 hours


$http.get("reloadresults?used=false", function (response)  { $scope.items = response items; }); at 12:03:05

现在,图像存在瓶颈或其他问题,第一次使用'used=true'调用最后返回,然后过滤器出现问题。

我知道在angularjs中有一个$ http拦截器,根据承诺,我该如何解决这个问题?因此请求按发送顺序处理,意味着'used = true',然后才使用= false。

编辑:无法阻止线程,无法重构,只需按照首次发送的顺序获得fullfil。我觉得以后生病了。

2 个答案:

答案 0 :(得分:0)

我不太了解你的问题,但我认为你正在寻找

int _len = txtPassword.Text.Length;

答案 1 :(得分:0)

您确实可以通过形成队列(承诺链)来确保以正确的顺序调用成功处理程序,但是在这种情况下,每次发出新请求时都会使先前的请求无效,从而更简单。 / p>

有很多方法可以实现这一目标。这是一个...

function cancelPrevious(fn) {
    var reject_ = null;
    return function(x) {
        if(reject_) reject_(new Error('cancelled'));
        return Promise.race(fn(x), new Promise(function(_, reject) {
            reject_ = reject; // if reject_ is called before fn(x) settles, the returned promise will be rejected.
        }));
    };
}

允许你写...

var get = cancelPrevious(function(str) {
    return $http.get(str);
});

...并从任意数量的事件线程发出请求:

get('reloadresults?used=true').then(function(response) {
    // This function will be reached only if 
    // $http.get('reloadresults?used=true') fulfills 
    // before another get() call is made.
    $scope.items = response.items;
});

...

// This call causes the then callback above to be suppressed if not already called
get('reloadresults?used=false').then(function(response) {
    $scope.items = response.items;
});

注意:

  • http请求未被取消。取而代之的是,每个请求产生的成功路径都可以取消"可取消"通过反对可拒绝的承诺。
  • 可以执行传递给cancelPrevious()的函数中包含的副作用;一般情况下,不要包含这些副作用。