从ajax回调调用Javascript(prototype)方法

时间:2013-09-09 10:41:16

标签: javascript jquery ajax

我已经编写了一些面向对象的Javascript,如下所示:

function MyClass(){

    this.SomeFunc(arg1){
        result = <some processing on arg1>;
        return result;
    };

    this.SomeOtherFunc(){
        return $.ajax({
            <some restful call>
        }).done(function(){
            var localvar = this.SomeFunc(<value obtained by restful call>);
            <some operations with localvar>;
        });
    };
};

var myObj = new MyClass();
myObj.SomeOtherFunc();

我在Web控制台中收到错误:“this.SomeFunc不是函数”。如果我直接在函数内调用它,就没有问题。调用仅在Ajax内部失败。调用此函数的正确方法是什么?

3 个答案:

答案 0 :(得分:4)

回调函数中的

this与引用this的{​​{1}}不同,请尝试:

SomeFunc

答案 1 :(得分:0)

由于您正在使用jQuery,您还可以确保允许您传入上下文的$ .proxy(http://api.jquery.com/jQuery.proxy/)方法。例如,你可以做

this.SomeOtherFunc(){
    return $.ajax({
        <some restful call>
    }).done($.proxy(function(){
        var localvar = thatFunc.SomeFunc(<value obtained by restful call>);
        <some operations with localvar>;
    }, this)); // Pass in what 'this' should be in method
};

这里,回调函数将以this执行,引用作为第二个参数传入的对象。

$.proxy(function(){ 
    // do stuff here 
}, this);

答案 2 :(得分:0)

考虑主要功能MyClass是您的构造函数。 这意味着您必须在那里定义SomeFunc,但是您正在调用它。 这就是您在控制台中显示的问题。

您可以修复定义函数,而不是调用它:

function MyClass(){
  // ----------vvvvvvvvvvv was missing
  this.SomeFunc = function(arg1) {
    result = <some processing on arg1>;
    return result;
  };

  // ---------------vvvvvvvvvvv same here
  this.SomeOtherFunc = function() {
    var _this = this
    return $.ajax({
      <some restful call>
    }).done(function(){
      // ------------v use _this instead of _this
      var localvar = _this.SomeFunc(<value obtained by restful call>);
      <some operations with localvar>;
    });
  };
};

var myObj = new MyClass();
myObj.SomeOtherFunc();

定义函数的另一种方法是通过原型:

MyClass = function() { ... }
MyClass.prototype.SomeFunc = function(arg1) {
  return <some processing on arg1>
}
MyClass.prototype.SomeOtherFunc = function() {
  var _this = this
  return $.ajax({ ... }).done(function(data) {
    _this.SomeFunc(data)
  })
}

主要区别在于,在构造函数中创建函数会为function的每次调用创建一个新的new MyClass

希望有所帮助。