我是否应该保留等于$q.defer()的变量,使其具有词法作用域?

Should I keep the variable that equals $q.defer() to have lexical scope?

本文关键字:变量 作用域 词法 保留 是否 defer      更新时间:2023-09-26

在我的应用程序中,我设置var def = $q.defer();并使用def.resolve(myFunction)。我很困惑我是否应该保持deflocal或只是让它成为一个全局变量,因为它总是等于$q.defer()。有什么建议吗?我总是犹豫,使一些全局变量所以抱歉,如果它可能听起来像一个愚蠢的问题。

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

在你resolve一次之后,这将是任何引用$q实例的响应。

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

这是一个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;
    }
  };
}