【问题标题】:How to configure angular with a provider that needs async initialization?如何使用需要异步初始化的提供者配置角度?
【发布时间】:2014-11-28 21:04:30
【问题描述】:

我有一个需要异步初始化的 serviceProvider。我希望我的控制器仅在初始化完成后才能访问此服务。

angular.module("myModule").provider("AsyncInit", {
    myThing: {},
    init: function(options) {
        doSomeAsyncStuff(options).success(function(newThing) {
            myThing = newThing;
        });
    },
    $get: function() {
        return {
            theThing: myThing
        }
    }
});

//Initialisation of myModule 
angular.module(myModule)
    .config(function(AsyncInitProvider) {
        AsyncInitProvider.init(options);
    })

如果我在控制器中访问AsyncInit.theThing,它一开始并没有初始化,但稍后会初始化。这在我看来是合乎逻辑的。

是否可以等到服务完全初始化?

【问题讨论】:

标签: javascript angularjs


【解决方案1】:

如果您确实需要在提供程序的配置过程中启动异步调用,则可以使用 $interval。

this.$get = function($q, $interval) {
  var deferred = $q.defer();
  var handler = $interval(function() {
    if (myThingHasBeenLoaded) {
      $interval.cancel(handler);
      deferred.resolve(myThingsValue);
    }
  }, 100);

  return {
    getMyThing: function() {
      return deferred.promise();
    }
  };
}

// In your controller:
myThingService.getMyThing().then(function(myThing) { console.log(myThing); } );

我使用它来加载 Google 实验 API,它运行良好。如果您的事物已成功加载,则间隔将检查所有 100 毫秒,然后解决承诺。这里明显的问题是它只每 100 毫秒解析一次,无论你的东西是否在 1 毫秒内加载。 如果您不必在配置步骤中进行异步调用,我强烈建议您只使用简单的 Promise:

angular.module("myModule").provider("AsyncInit", function () {

  this.options = {};

  this.init = function(options) {
    this.options = options;
  };

  this.$get = function($q) {
    var deferred = $q.defer();
    var self = this;
    return {
      getMyThing: function() {
        doSomeAsyncStuff(self.options)
          .success(function(newThing) {
            deferred.resolve(newThing);
          })
          .failure(function(errors) {
            deferred.reject(errors);
          });

        return deferred.promise();  
      }
    };
  };
});

您的控制器中的代码将与上述示例中的代码相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-14
    • 1970-01-01
    • 2019-01-29
    • 1970-01-01
    • 2017-03-09
    • 2020-08-24
    相关资源
    最近更新 更多