javascript - 使用 $q 在 Angular 上覆盖 javascript 函数

标签 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);
  }
});

我希望这些函数返回 promise 而不是回调,所以我的第一个尝试是将它们包装在其他函数上:

$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;
};

但我想替换原来的原型(prototype)函数而不是创建一个新的,所以我试过这个:

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

我错过了什么?

最佳答案

您需要先创建 promise ,运行方法(解决或拒绝 promise ),然后返回 promise :

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

关于javascript - 使用 $q 在 Angular 上覆盖 javascript 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26871762/

相关文章:

javascript - 错误 : Components. utils undefined - Firefox 附加组件

javascript - 具有用于 .click 事件的多个按钮的 Ajax 函数

javascript - 如何从angularjs中的两个不同地方调用同一个函数

javascript - 使用 AngularJS 和 Kendo UI 的简单模式对话服务

javascript - 在 AngularJS 中返回一个 Promise 的好方法,怎么做?

javascript - 在同一函数中解决 promise 后返回 promise

javascript - 在插入符位置 (IE) 将文本插入可编辑的 IFRAME

JavaScript函数参数问题

javascript - angularjs ui-grid 将列高度更改为自动会导致奇怪的行显示在其他列上

javascript - 当promise循环时如何处理数据?