如何将Angular promise转换为jquery延迟对象

pha*_*ani 10 jquery promise jquery-deferred angularjs angular-promise

我想将我的模块/ sdk中的promises返回到非角度javascript.例如,如果我返回jquery的承诺,我应该可能发送jquery延迟对象.如何将Angular承诺转换为jquery promise/deferred obj.

任何建议都非常感谢.

Ben*_*aum 21

免责声明:jQuery承诺与其他库不相称 - 完全没有.jQuery不会自己同化其他第三方承诺.另一方面,角度$ q承诺 - 将,所以无论何时你有选择,将jQuery承诺同化为Angular承诺,而不是相反.(所有这些都在jQuery 3.0中发生了变化,如果您看到此免责声明并且3.0已经发布 - 请发表评论).

将jQuery承诺转换为Angular承诺:

var angularPromise = $q.when(jQueryPromise); // eg: $q.when($.get(...));
Run Code Online (Sandbox Code Playgroud)

将jQuery承诺转换为本机或Bluebird承诺:

var promise = Promise.resolve(jQueryPromise); // eg: Promise.resolve($.get(..));
Run Code Online (Sandbox Code Playgroud)

转换Promise/A +投诉承诺,例如$ q Angular promise或Bluebird承诺或本机承诺到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
Run Code Online (Sandbox Code Playgroud)

另外值得注意的是 - Angular承诺可以使用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
});
Run Code Online (Sandbox Code Playgroud)