避免Angular.js中的重复异步服务初始化

时间:2015-07-07 09:26:47

标签: javascript angularjs asynchronous

我有一个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。这似乎有效,但感觉不够优雅和脆弱,有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

您正在寻找解决问题的 debounce 方法。

下划线库文档_.debounce()做什么

  

创建并返回传递函数的新去抖版本   这会将其执行推迟到等待毫秒之后   自上次调用以来经过的时间。对实施有用   只有在输入停止到达后才会发生的行为。   例如:渲染Markdown注释的预览,重新计算   窗口停止调整大小后的布局,依此类推。