我应该保持等于$ q.defer()的变量具有词法范围吗?

时间:2015-07-30 19:33:37

标签: javascript angularjs

在我的申请中,我正在设置var def = $q.defer();并使用def.resolve(myFunction)。我很困惑我是否应该保持def局部或只是使它成为一个全局变量,因为它总是等于$q.defer()。有什么建议?我总是犹豫是否要把某个东西变成一个全局变量,如果它听起来像一个愚蠢的问题,那就很抱歉。

2 个答案:

答案 0 :(得分:2)

def返回的对象(您分配给$q.defer())表示单个延迟任务,因此def应保持为本地。您需要调用$q.defer()并将结果对象分配给每个延迟任务的变量。正如汤姆在他的回答中所说,对def.resolve()的同一个实例的def的后续调用将返回与初始分辨率相同的值,这在某些情况下可能有用(例如,需要的值)从服务器检索,但只需要检索一次并可以缓存,但您不知道第一次检索它的时间可能是因为它取决于用户行为。)

答案 1 :(得分:1)

在您resolve之后,这将成为引用$q实例的任何内容的响应。

这是一个示例,在控制器中,将记录"其他内容" 两次,因为它是您的全局$q对象的第一个分辨率(已解决) 200ms而不是400ms。如果要更改factory1.doSomething()运行的长度,那么结果将是结果):

Here是一个jsBin。

angular
  .module('app', [])
  .factory('factory1', factory1)
  .factory('factory2', factory2)
  .factory('qfactory', qfactory)
  .controller('controllerSomething', controllerSomething);

function controllerSomething(factory1, factory2) {
  factory1.doSomething().then(function(result) {
    console.log(result); // something else
  });

  factory2.doSomething().then(function(result) {
    console.log(result); // something else
  });
}

function factory1(qfactory) {
  return {
    doSomething: function() {
      setTimeout(function() {
        qfactory.getQ().resolve('something');
      }, 400);

      return qfactory.getQ().promise;
    }
  };
}

function factory2(qfactory) {
  return {
    doSomething: function() {
      setTimeout(function() {
        qfactory.getQ().resolve('something else');
      }, 200);

      return qfactory.getQ().promise;
    }
  };
}

function qfactory($q) {
  var q = $q.defer();

  return {
    getQ: function() {
      return q;
    }
  };
}