使用promise在Angular中实现页面加载器

时间:2015-12-10 07:29:51

标签: angularjs promise loader

我想知道实现一个函数的最佳方法是什么,它将负责在某些请求上切换gif。我不想在所有的http请求中显示它,因此我不想将它放在拦截器中 - 我想创建一个服务。

我很可能会使用一个功能如下:

LoaderFunction(SomeFunction())

无论何时启动和解决承诺,都会切换img或其他内容。 SomeFunction()通常是http请求,它们已经有了自己的承诺。

谢谢!

2 个答案:

答案 0 :(得分:1)

最简单的方法是使用计数信号量和the disposer pattern。它适用于任何数量的持续请求。

4.5.2

这将范围绑定到事件的生命周期 - 就像C ++中的RAII一样。这样就可以了:

withLoader.count = 0;
function withLoader(fn){
     if(count === 0) initiateLoader();
     count++;
     return $q.when(fn).finally(function(){
         count--;
         if(count === 0) finishLoader();
     });
}

当计数器达到0时,加载程序将完成,即所有请求完成时。

因为它是Angular,你可能想把withLoader(someFunction); withLoader(someFunction); withLoader(function(){ return $http.post(...); }).then(function(){ // http request finished, like your normal `then` callback }); 放在自己的服务中,并有一个指令管理加载本身。

答案 1 :(得分:0)

嗯,最简单的方式是通过$http调用自己来使用承诺。

示例:

$http.post("/", data, function() {
  initiateLoader(); // this is a function that starts the loading animation.
}).success(function (data) {
  finishLoader(); // this is a function that ends the loading animation.
}).catch(function(err) {
  finishLoader(); //so the loader also finishes on errors.
});