2016-03-22 5 views
0

Seit Promise ist jetzt offiziell angegeben und alle, wie konvertiere ich die $q.defer() Versprechen Erstellung in den folgenden Code-Schnipsel, um stattdessen die $q(function (resolve, reject) {}) Konstruktorsyntax zu verwenden?

// Cancel any ongoing $http request so that only the most recent $http 
// callback gets invoked 
var canceller; 
function getThing(id) { 
    if (canceller) canceller.resolve(); 
    canceller = $q.defer(); 

    return $http.get('/api/things/' + id, { 
    timeout: canceller.promise 
    }); 
} 

(Fyi von $http docs: timeout ist "... in Millisekunden oder Versprechen, das die Anforderung abbrechen sollte, wenn gelöst.")

+0

Ich verstehe nicht, was Ihr Ziel ist. Ihr Code ist in Ordnung und funktioniert, es gibt keinen Grund, etwas zu ändern. – Bergi

+0

"* Wie verwende ich die Promot Konstruktorsyntax? *" - [** Sie nicht! **] (http://stackoverflow.com/q/23803743/1048572) – Bergi

+0

kein Ziel. nur eine akademische Übung – thatmarvin

Antwort

1

ich es so tun würde:

var canceller = null; 
function getThing(id) { 
    if (canceller) canceller(); 
    return Promise.resolve($http.get('/api/things/' + id, { 
    timeout: new Promise(function(resolve) { 
     canceller = resolve; 
    }) 
    })); 
} 

Ich nehme an, Sie hätten canceller.reject sowieso nie verwendet, so können Sie einfach um die resolve Funktion selbst halten, um es beim nächsten Mal zu nennen.

+0

$ http.get() gibt eine Zusage zurück, also glaube ich nicht, dass es den Promise.resolve() -Wrap braucht? – thatmarvin

+0

@thatmarvin: Es gibt keins dieser glänzenden neuen offiziellen "Promise's" zurück, sondern ein altes, langweiliges AngularJs-Versprechen :-) Wenn du Angular Versprechungen (und '$ q' anstelle von' new Promise' verwenden willst)) dann kannst du es natürlich weglassen. – Bergi

+0

Gotcha, akzeptiert. sehr offensichtlich jetzt, dass ich es sehe, danke! – thatmarvin