我正在使用具有许多这些功能的javascript库:
var obj = Object.create(var1, var2);
obj.execute({
success: function(newObj) {
console.log("Success: " + newObj)
},
failure: function(newObj, errorStr) {
console.log("Error: " + errorStr);
}
});
我希望这些函数返回promises而不是回调,所以我的第一次尝试是将它们包装在其他函数上:
$scope.replaceExecute = function(obj){
var defer = $q.defer();
obj.execute({
success: function(newObj) {
$scope.$apply(function (){
defer.resolve(newObj);
});
},
failure: function(newObj, errorStr) {
$scope.$apply(function (){
defer.reject(newObj, errorStr);
});
}
});
return defer.promise;
};
但是我想替换原始的原型函数而不是创建一个新的函数,所以我试过这个:
var origMethod = Object.prototype["execute"];
// Overwrite original function by wrapping it with $q
Object.prototype["execute"] = function() {
return origMethod.apply(this, arguments)
.then(function(data){
var defer = $q.defer();
defer.resolve(data);
return defer.promise;
}, function(err){
var defer = $q.defer();
defer.reject(err);
return defer.promise;
});
};
但是在使用它时,我没有获得newObj对象,而是使用回调方法:
var obj = Object.create(var1, var2);
obj.execute().then(
function(newObj) {
// This won't get newObj but some callback methods
console.log("Success: " + newObj)
},
function(error,errorString) {
// This won't get error but some callback methods
}
);
我错过了什么?
答案 0 :(得分:2)
您需要首先创建承诺,运行方法(将解析或拒绝承诺),但返回承诺:
Object.prototype["execute"] = function() {
var defer = $q.defer();
origMethod.apply(this, arguments)
.then(function(data){
defer.resolve(data);
}, function(err){
defer.reject(err);
});
return defer.promise;
});