javascript - 如何使用需要异步初始化的提供者配置 Angular ?

标签 javascript angularjs

我有一个 serviceProvider 需要一些异步初始化。我希望我的 Controller 仅在初始化完成时访问此服务。

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);
    })

如果我在 Controller 中访问 AsyncInit.theThing,它首先不会初始化,但稍后会初始化。这对我来说似乎合乎逻辑。

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

最佳答案

如果你真的需要在你的提供者的配置过程中启动异步调用而不是你可以使用 $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 Experiments API,效果很好。如果您的东西已成功加载,则间隔将检查所有 100 毫秒,然后解决 promise 。这里明显的问题是它只每 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();  
      }
    };
  };
});

Controller 中的代码与上面的示例相同。

关于javascript - 如何使用需要异步初始化的提供者配置 Angular ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27188662/

相关文章:

javascript - JS 与 PHP : if/else

javascript - 生成随机坐标(排除一些特定的)

javascript - Timeinterval 完成后删除带有淡出的类?

javascript - 使用 ViewModel 构造函数 knockout 虚拟组合

JSON API 错误 - 您需要使用容量为 'edit_posts' 的用户登录

javascript - 返回数据后如何在 AngularJs 中链接多个方法

javascript - 如何获取/设置 Controller /模块之外的变量?

javascript - 从 JSON 数据中以 Angular 填充多个下拉选择框

javascript - 在 Controller 中使用 'this' 或 "var Vm = this"声明的变量未反射(reflect)使用指令访问时的值

javascript - 有没有办法在点击时运行 svg?