2014-07-07 24 views
8

Tôi muốn trả lại lời hứa từ mô-đun/sdk của tôi thành javascript không góc cạnh. Ví dụ, nếu tôi trở về hứa với một jquery, tôi có lẽ nên gửi đối tượng jquery hoãn lại. Làm thế nào tôi có thể chuyển đổi một lời hứa Angular thành một lời hứa jquery/obj trì hoãn.Cách chuyển đổi lời hứa Angular sang đối tượng jquery deferred

Bất kỳ đề xuất nào được đánh giá cao.

+0

Tại sao? Có một ví dụ? Ví dụ: –

+0

Ví dụ: bạn có thể chuyển đổi bất kỳ lời hứa của bên thứ ba nào thành lời hứa $ q/Q bằng $ q.when (thirdPartyPromise). Nhưng nên có thư viện đó để sử dụng lời hứa của tôi. Tôi không muốn ép khách hàng của tôi sử dụng Q hoặc góc cạnh để anh ấy có thể tái sử dụng lời hứa của tôi. Nếu tôi có thể chuyển đổi nó thành lời hứa tương thích, anh ta muốn nó sẽ ít đau đớn hơn để sử dụng. – phani

+0

Bạn nên cân nhắc sử dụng thư viện lời hứa tối giản chứ không phải các lời hứa jQuery, các lời hứa jQuery vốn đã có vấn đề trong xử lý lỗi. –

Trả lời

20

Tuyên bố từ chối: Lời hứa jQuery không chơi đẹp với các thư viện khác - tại tất cả. jQuery sẽ không tự đồng hóa các lời hứa của bên thứ ba khác. Angular $ q hứa hẹn mặt khác - sẽ, do đó, bất cứ khi nào bạn có sự lựa chọn, đồng hóa lời hứa jQuery vào một lời hứa Angular và không ngược lại. (Tất cả những thay đổi này trong jQuery 3.0, nếu bạn thấy tuyên bố từ chối trách nhiệm này và 3.0 đã được phát hành - vui lòng để lại nhận xét).

Chuyển đổi một lời hứa jQuery vào một lời hứa góc:

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

Chuyển đổi một lời hứa jQuery để một lời hứa mẹ đẻ hoặc Bluebird:

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

Chuyển đổi một Promises/A + khiếu nại hứa như $ q kiễu góc lời hứa hoặc lời hứa Bluebird hoặc lời hứa gốc về lời hứ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 

Cũng đáng chú ý - lời hứa góc có thể tiêu thụ jQuery hứa hẹn:

$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

Cảm ơn bạn rất nhiều vì câu trả lời của bạn Benjamin. – phani

+0

hello, tôi có một lời hứa signalR (SignalR trả về một lời hứa Jquery), chunkPromise = proxy.server.myMethod (a, b) nhưng khi tôi làm $ q.when (chunkPromise) đối tượng trả về là "d", chỉ với một thành viên của tiểu bang $$, chứ không phải lời hứa $ q. tôi làm gì sai – pomarc

+0

Jquery 3.0 đã được phát hành;) –

Các vấn đề liên quan