避免在Angular.js中重复异步服务初始化
Avoiding duplicate asynchronous service initialisations in Angular.js
我有一个异步交付结果的Angular.js服务,在看了一段时间后,做这件事的主要模式似乎是使用像这样的$q承诺
angular.module('fooApp').factory('foo', function ($q) {
var result;
function build() {
var d = $q.defer();
longAsyncInit(function(data) {
result = data;
d.resolve(result);
});
return d.promise;
};
return {
get: function () {
if (result) {
return $q.when(result);
} else {
return build();
}
}
}
});
问题是,我有许多服务,有这个服务作为一个依赖关系,并在第一个longAsyncInit结束之前多次调用get(这意味着longAsyncInit被调用多次,每次创建一个新的承诺)。在我的情况下,这是不可接受的,我真的需要longAsyncInit调用一次,而不是更多。我现在是这样处理这个问题的
angular.module('fooApp').factory('foo', function ($q) {
var result
var d;
function build() {
d = $q.defer();
longAsyncInit(function(data) {
result = data;
d.resolve(result);
});
return d.promise;
};
return {
get: function () {
if (result) {
return $q.when(result);
} else if (d) {
return d.promise;
} else {
return build();
}
}
}
});
这意味着当get()调用时,如果longAsyncInit已经在进行中,它返回当前的承诺,而不是创建一个新的并再次调用longAsyncInit。这似乎是工作,但感觉不优雅和脆弱,有没有更好的方式做到这一点?
您正在寻找debounce方法来解决问题。
来自下划线库文档_.debounce()
做什么
创建并返回传递的函数的新去绑定版本这将延迟其执行,直到等待毫秒有自上次调用它以来所经过的时间。对实现有用只有在输入停止到达后才应该发生的行为。例如:呈现Markdown注释的预览,重新计算窗口停止调整大小后的布局,等等。
-
更多的解释有人能解释一下"脱线"吗?
-
一些内容要读:http://davidwalsh.name/javascript-debounce-function
相关文章:
- 当视图在AngularJS中返回时,我如何获得异步服务调用来更新视图
- 如何在Angular中设置异步HTTP服务的回调,以便在不定义数组的情况下在控制器中填充数组
- 如何访问回调函数之外的异步angularjs服务数据
- 异步http请求服务
- 在异步内部函数返回 [UI-路由器和 HTML 服务] 之后返回外部 fn
- 如何将指令模型绑定到异步服务数据
- 如何从 angularjs 服务中的异步调用返回响应
- 将 Javascript .js(调用 Web 服务)异步加载到页面中
- AngularJS函数在多次异步服务调用后
- 异步服务调用不工作
- 如何在调用异步Web服务响应时将值设置为数组
- Angular:在控制器之间共享异步服务数据
- 将一个服务(工厂)注入到另一个服务中,这两个服务都是异步的
- Angular.js将数据从异步服务传递到作用域
- 用TypeScript编写的Geocoder谷歌地图服务的因果报应异步测试
- 如何在服务中使用异步库
- 如何在javascript中实现异步服务调用
- 异步服务调用后,nhandsontable数据流未定义
- 如何将异步服务中的数据设置到控制器$scope中?
- 避免在Angular.js中重复异步服务初始化