使用$ q覆盖角度上的javascript函数

时间:2014-11-11 18:22:43

标签: javascript angularjs angular-promise

我正在使用具有许多这些功能的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
  }
);

我错过了什么?

1 个答案:

答案 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;
});