#jquery #angularjs #promise #jquery-deferred #angular-promise
#jquery #angularjs #обещание #jquery-отложенный #angular-обещание
Вопрос:
Я хочу вернуть обещания из моего модуля / sdk в неугловой javascript. Например, если я возвращаю promise в jquery, я, вероятно, должен отправлять отложенный объект jquery. Как я могу преобразовать Angular promise в jquery promise / отложенный объект.
Мы высоко ценим любые предложения.
Комментарии:
1. Почему? Есть пример?
2. Например, вы можете преобразовать любое стороннее обещание в обещание $ q / Q, используя $q.when(обещание третьей стороны). Но должна быть эта библиотека, чтобы использовать мое обещание. Я не хочу заставлять своего клиента использовать Q или angular, чтобы он мог повторно использовать мое обещание. Если бы я мог преобразовать его в совместимый promise, который он хотел, это было бы менее болезненно в использовании.
3. Вам следует рассмотреть возможность использования минималистичной библиотеки promise, а не jQuery promises, обещания jQuery по своей сути проблематичны при обработке ошибок.
4. Обещания @phani разработаны так, чтобы быть взаимозаменяемыми между реализациями, вы ни к чему не принуждаете своего клиента. Отложенные объекты jQuery не соответствуют спецификации Promise, поэтому вам не следует использовать их вне jQuery.
Ответ №1:
Отказ от ответственности: обещания jQuery плохо сочетаются с другими библиотеками — вообще. jQuery не будет самостоятельно ассимилировать другие сторонние обещания. Обещания Angular $ q, с другой стороны, — будут, поэтому всякий раз, когда у вас есть выбор, преобразуйте обещание jQuery в обещание Angular, а не наоборот. (Все это меняется в jQuery 3.0, если вы видите это заявление об отказе от ответственности и 3.0 уже выпущен — пожалуйста, оставьте комментарий).
Преобразование обещания jQuery в обещание Angular:
var angularPromise = $q.when(jQueryPromise); // eg: $q.when($.get(...));
Преобразование jQuery promise в native или Bluebird promise:
var promise = Promise.resolve(jQueryPromise); // eg: Promise.resolve($.get(..));
Преобразование обещаний / обещаний жалоб, таких как $ q Angular promise или Bluebird promise, или собственных обещаний в jQuery promises:
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
Также стоит отметить — 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. здравствуйте, у меня есть обещание SignalR (SignalR возвращает обещание Jquery), chunkPromise=proxy.server. Мой метод (a,b) но когда я делаю $ q.when(chunkPromise), возвращаемый объект является «d», с только членом состояния $ $, а не с обещанием $ q. что я делаю не так?
2. Выпущен Jquery 3.0 😉
3. Спасибо @MarioLevrero!