【问题标题】:Why doesn't my $q.defer().resolve work?为什么我的 $q.defer().resolve 不起作用?
【发布时间】:2016-04-05 08:34:40
【问题描述】:

正如演示所示,当我在服务中定义我的承诺并将其返回(演示中的promise1)时,它根本没有解决。

但是当我在控制器中定义promise(demo中的promise2)时,效果很好。为什么?

this is my demo on codepen

serv.getDefer = function() {
    var defer = $q.defer();
    return {
      defer: defer,
      promise: defer.promise
    }
}

var defer1 = serv.getDefer().defer;
var promise1 = serv.getDefer().promise;
promise1.then(function() {
    alert('promise1 should work,but doesnt')
})
defer1.resolve();

var defer2 = serv.getDefer().defer;
var promise2 = defer2.promise;
promise2.then(function() {
    alert('promise2 works good')
})
defer2.resolve();

【问题讨论】:

    标签: javascript angularjs asynchronous promise q


    【解决方案1】:

    查看闭包,第二次调用函数 getDefer() 时,它会创建一个新变量并返回它。

    但是,这可能有效(但未测试)

    var deferred = serv.getDefer();
    deferred.promise.then(function() {
        alert('promise1 should work,but doesnt')
    });
    deferred.defer.resolve();
    

    【讨论】:

      【解决方案2】:

      每次调用serv.getDefer() 时它都会返回一个新的延迟对象,在你的promise 1 中你调用serv.getDefer() 来创建defer1promise1。这两个变量现在不是同一个promise,所以当你解决defer1时,promise1的promise仍然没有解决。

      在您的第二个示例中,promise2defer2 的承诺,因此当您解决defer2 时,承诺将被解决。

      要解决此问题,您必须执行以下操作:

      var deferred = serv.getDefer(),
          defer1 = deferred.defer
          promise1 = deferred.promise;
      
      promise1.then(function() {
        alert('promise1 should work,but doesnt')
      });
      
      defer1.resolve();
      

      【讨论】:

        【解决方案3】:

        promise1 不是由 defer1 生成的。相反,您正在通过再次调用 getDefer() 创建一个新的延迟对象。

        promise2 有效,因为它是由 defer2.promise() 生成的

        我认为该行应该是

        var promise1 = defer1.promise;
        

        【讨论】:

          猜你喜欢
          • 2015-09-25
          • 2018-03-05
          • 2013-04-19
          • 2015-10-17
          • 2016-02-20
          • 2023-04-03
          • 2012-01-07
          • 2012-06-11
          • 2015-08-26
          相关资源
          最近更新 更多