我有一个Angular.js服务,它以异步方式提供结果,在查看了一段时间之后,这样做的主要模式似乎是使用这样的$ q promises
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会多次调用,每次都会创建一个新的promise)。在我的情况下这是不可接受的,我真的需要一次调用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已经在进行,它将返回当前的promise,而不是创建一个新的promise并再次调用longAsyncInit。这似乎有效,但感觉不够优雅和脆弱,有更好的方法吗?
答案 0 :(得分:0)
您正在寻找解决问题的 debounce 方法。
从下划线库文档_.debounce()
做什么
创建并返回传递函数的新去抖版本 这会将其执行推迟到等待毫秒之后 自上次调用以来经过的时间。对实施有用 只有在输入停止到达后才会发生的行为。 例如:渲染Markdown注释的预览,重新计算 窗口停止调整大小后的布局,依此类推。