2014-07-07 24 views
8

Chcę zwrócić obietnice z mojego modułu/sdk na nieklasowy javascript. Na przykład, jeśli zwrócę obietnicę jquery, prawdopodobnie powinienem wysłać obiekt odroczony jquery. Jak mogę przekonwertować obietnicę Angulara na obietnicę jquery/odroczony obiekt.Jak przekonwertować obietnicę kątową na obiekt odroczony jquery

Wszelkie sugestie są mile widziane.

+0

Dlaczego? Masz przykład? –

+0

Na przykład można przekonwertować dowolną obietnicę strony trzeciej na obietnicę $ q/Q za pomocą $ q.when (thirdPartyPromise). Ale powinna mieć tę bibliotekę, by użyć mojej obietnicy. Nie chcę zmuszać mojego klienta do używania Q lub kątowego, aby mógł ponownie wykorzystać moją obietnicę. Gdybym mógł przekonwertować to na zgodną obietnicę, chciałby, żeby użycie jej było mniej bolesne. – phani

+0

Należy rozważyć zastosowanie minimalistycznej biblioteki obietnic, a nie obietnic jQuery, obietnice jQuery są z natury problematyczne w obsłudze błędów. –

Odpowiedz

20

Zastrzeżone: jQuery obietnice nie grać ładny z innych bibliotek - na wszystko. jQuery nie będzie asymilować innych obietnic stron trzecich. Z drugiej strony obietnicowe obietnice q - będą, więc za każdym razem, gdy będziesz miał wybór, przyswoisz obietnicę jQuery do obietnicy Angular, a nie odwrotnie. (Wszystko to zmienia się w jQuery 3.0, jeśli widzisz to zastrzeżenie, a 3.0 zostało już wydane - zostaw komentarz).

Konwersja obietnicę jQuery do kątowym obietnicy:

var angularPromise = $q.when(jQueryPromise); // eg: $q.when($.get(...)); 

przekształcenie obietnicy jQuery natywny lub Bluebird obietnicy:

var promise = Promise.resolve(jQueryPromise); // eg: Promise.resolve($.get(..)); 

Konwersja obiecuje/A + reklamacji obietnicę jak $ q Kątowymi obietnica lub obietnica Bluebird lub natywne obietnice jQuery:

function convert(p){ 
    var d = $.Deferred(); 
    p.then(function(val){ 
     d.resolve(val); 
    }, function(err){ 
     d.reject(err); 
    }); 
    return d.promise(); 
} 

var jqPromise = convert($http.get(...)); // example usage 

// you might be tempted to think you can easily do: 
var jqPromise = $.when($http.get(...)); 
// however - this will will fail inconsistently due to differences between 
// jQuery and Angular promises 

Warto również zauważyć - kątowe obietnice mogą spożywać jQuery obiecuje:

$http.get(...).then(function(id){ 
    return $.get("http://..."+id); // will work, though pointless because $http.get 
}).then(function(result){ 
    // contains result of $.get call here 
}); 
+1

Dziękuję bardzo za odpowiedź Benjamina. – phani

+0

witam, mam obietnicę signalR (SignalR zwraca obietnicę Jquery'ego), chunkPromise = proxy.server.myMethod (a, b) , ale kiedy robię $ q.when (chunkPromise) zwróconym obiektem jest "d", tylko członek państwa $$, a nie obietnica $ q. co mam zrobić źle? – pomarc

+0

Jquery 3.0 został wydany;) –