2016-04-05 4 views
0

Как показывает демонстрация, когда я определяю свое обещание на службе и возвращаю его обратно (обещание1 в демо), оно вообще не разрешается.

Но когда я определяю обещание (обещание2 в демонстрации) в контроллере, он работает хорошо. Почему?

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

ответ

2

Посмотрите на затворы, второй раз при вызове функции getDefer(), это делает новую переменную и возвращает ее.

Однако, это может работать (не тестировался, хотя)

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

Каждый раз, когда вы звоните serv.getDefer() он возвращает новый объект deffered, в свое обещание 1 вы называете serv.getDefer() как создать defer1 и promise1. Теперь две переменные не совпадают с обещаниями, поэтому, когда вы разрешаете defer1, обещание promise1 по-прежнему остается нерешенным.

в вашем втором примере promise2 - это обещание defer2, поэтому при решении defer2 обещание будет разрешено.

, чтобы исправить это, вы должны сделать следующее:

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

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

defer1.resolve(); 
1

promise1 не порождается defer1. Вместо этого вы создаете новый отложенный объект, снова вызывая getDefer().

promise2 работает, потому что она порождается defer2.promise()

Я думаю, что линия должна быть

var promise1 = defer1.promise; 

 Смежные вопросы

  • Нет связанных вопросов^_^