为什么我的 $q.defer().resolve 不起作用?

Why doesn't my $q.defer().resolve work?

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

但是当我在控制器中定义 promise(演示中的 promise2)时,它起作用了 good.Why?

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

每次你调用 serv.getDefer() 它 returns 一个新的延迟对象,在你的承诺 1 中你调用 serv.getDefer() 来创建 defer1promise1 .这 2 个变量现在不是同一个承诺,因此当您解决 defer1 时,promise1 的承诺仍然未解决。

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

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

var deferred = serv.getDefer(),
    defer1 = deferred.defer
    promise1 = deferred.promise;

promise1.then(function() {
  alert('promise1 should work,but doesnt')
});

defer1.resolve();

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

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

生成的

我觉得应该是

var promise1 = defer1.promise;

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

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

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