2017-03-10 5 views
0

Was sind die möglichen Gründe für die then 's Rückruf eines Versprechens, nicht aufgerufen werden? Zum Beispiel:

function testPromise() { 
    console.log("this gets logged") 
    return $q(function(resolve, reject) { 
    console.log("this too") 
    resolve("test") 
    console.log("and this"); 
    $rootScope.$apply() 
    console.log("and this too"); 
    }) 
} 
testPromise().then(function(result){ 
    console.log("this never gets logged") 
}); 

Bin ich nicht auf der Hand etwas zu sehen? Vielen Dank.

+1

Ähnliche Fragen wurden ** viele ** mal zuvor gestellt, obwohl ich denke ** Ihr spezifisches Problem kommt von Aufruf $ $ rootScope. $ Apply() 'in der Rückkehr-Anweisung, anstatt davor, eine erfordern zusätzlicher Verdau. Versuchen Sie, $ $ rootScope. $ Digest() 'kurz vor' $ rootScope. $ Apply() 'hinzuzufügen. –

+1

Ziemlich sicher "$ q" löst einen Scope-Digest bei resolve/reject ganz alleine aus. Sie müssen es nicht manuell hinzufügen – Phil

+0

Ich stimme mit Phil überein, und tatsächlich hatte ich aus irgendeinem Grund Probleme mit $ apply() bei meinem Beispiel. – moplin

Antwort

0

Vielen Dank für Ihre Antworten. Wie sich herausstellte und einige von Ihnen erwähnten, dass es damit zu tun hat, wo ich diese Funktion aufgerufen habe. So funktioniert das Anrufen von einer normalen Funktion. Calling von einem Rückruf von einem anderen then hat auch funktioniert, aber von context.sync().then() wo context.sync() ist eine Word Add-in Versprechen (und wer weiß, was es eigentlich ist) - nicht. Also konvertierte ich meine Funktion zu einem Rückruf, anstatt ein Versprechen zu sein.

0

Dies hängt von der Version von AngularJS ab, die Sie verwenden.

In AngularJS 1.2 $q was not a function und stattdessen erforderlich, dass Sie etwas namens "aufgeschoben" erstellen und ein Versprechen separat zurückgeben.

Sie sollten jedoch einen Fehler in der Konsole erhalten, die Ihnen sagt, wenn dies der Fall ist.

0

Es hängt alles davon ab, wo Sie anrufen von. Wenn es während der Ausführungszeit eines Digest-Zyklus ist, verursacht Ihr Aufruf einen Fehler und beendet die Ausführung des Skripts.

Ihr Beispiel funktioniert perfekt ohne . Könnten Sie mehr Kontext dazu geben, wie Sie es verwenden wollten?

0

Ich hoffe, das hilft. Ich denke, es ist nur, wie Sie $ q verwenden. Also habe ich ein funktionierendes Beispiel gemacht.

In meinem Beispiel verwende ich $ q in einem Service und verzögere seine Antwort mit $ timeout Ich löschte die $ apply() Ich weiß nicht, warum Sie es verwenden.

app.factory('TestingService', TestingService); 
    function TestingService($q, $timeout) { 
    return {runPromise:runPromise}; 
    function runPromise() { 
     return $q(function(resolve, reject) { 
      console.log("inside my $q") 
      $timeout(function(){ 
      resolve("$q is working fine"); 
      }, 2000); //Lets use $timeout, just to see the result 
     }); 
    }; 
    } 

und dann

TestingService.runPromise().then(
    function(result){ 
    console.log('result::',result); 
    vm.test = result; 
}); 

https://jsfiddle.net/moplin/r0vda86d/

Ich hoffe, es hilft.

Verwandte Themen