2014-07-07 32 views
8

我想從我的模塊/ sdk返回承諾到非角度的JavaScript。例如,如果我將jQuery的承諾返回,我應該可能會發送jQuery延遲對象。我怎樣才能將一個Angular promise轉換成jquery promise/deferred obj。如何將Angular承諾轉換爲jQuery延期對象

任何建議,非常感謝。

+0

爲什麼?有一個例子嗎? –

+0

例如,您可以使用$ q.when(thirdPartyPromise)將任何第三方承諾轉換爲$ q/Q承諾。但應該有這個圖書館來使用我的承諾。我不想強迫我的客戶使用Q或角度,以便他可以重用我的承諾。如果我可以將它轉換成兼容的承諾,那麼使用它就不那麼痛苦了。 – phani

+0

你應該考慮使用極簡主義承諾庫而不是jQuery承諾,jQuery承諾在處理錯誤方面本質上是有問題的。 –

回答

20

免責聲明:jQuery的承諾沒有發揮好與其他圖書館 - 在 所有。 jQuery不會同意其他第三方的承諾。另一方面,角度的$ q承諾 - 會,所以無論何時你有選擇,將jQuery承諾融入到Angular承諾中,而不是相反。 (所有這一切都改變了jQuery 3.0,如果你看到這個免責聲明和3.0已經發布 - 請留下評論)。

轉換一個jQuery的承諾轉變成一個角承諾:

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

轉換一個jQuery承諾到本地或藍鳥承諾:

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

轉換像$ Q角一個承諾/ A +投訴承諾承諾或藍鳥承諾或本土承諾轉化爲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 

另外值得一提 - 角承諾可以消耗jQuery的承諾

$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

非常感謝你的回答本傑明。 – phani

+0

你好,我有一個signalR的承諾(SignalR返回一個JQuery的承諾),chunkPromise = proxy.server.myMethod(a,b) 但是當我做$ q.when(chunkPromise)時返回的對象是「d」,只有一個$$州的成員,而不是$ q的承諾。我做錯了什麼? – pomarc

+0

Jquery 3.0已經發布;) –