Как преобразовать Angular promise в отложенный объект jquery

#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!