2016-04-05 634 views
0

Wie die Demo zeigt, wenn ich mein Versprechen im Service definiere und es zurückgebe (provide1 in der Demo), löst es überhaupt nicht auf.

Aber wenn ich das Versprechen (Versprechen2 in der Demo) im Controller definieren, funktioniert es gut.Warum?

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

Antwort

2

Blick in Schließungen, das zweite Mal, wenn Sie die Funktion getDefer() aufrufen sein, es macht eine neue Variable und gibt sie zurück.

Doch dies funktionieren könnte (allerdings nicht getestet)

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

Jedes Mal, wenn Sie serv.getDefer() nennen es gibt ein neues DEFFERED Objekt 1 in Ihrem Versprechen rufen Sie serv.getDefer() sowohl defer1 und promise1 zu erstellen. Die 2 Variablen sind jetzt nicht das gleiche Versprechen. Wenn Sie also defer1 auflösen, ist das Versprechen von promise1 immer noch ungelöst.

in Ihrem zweiten Beispiel promise2 ist das Versprechen von defer2, so, wenn Sie defer2 auflösen, wird das Versprechen gelöst werden.

zu beheben diese Sie Folgendes tun:

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

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

defer1.resolve(); 
1

promise1 nicht erzeugt durch defer1. Stattdessen erstellen Sie ein neues verzögertes Objekt, indem Sie erneut getDefer() aufrufen.

promise2 funktioniert, weil es durch defer2.promise erzeugt()

ich denke, die Linie sollte

var promise1 = defer1.promise;