1

标题有点奇怪,不太清楚用一句话来解释它的最佳方式……

目前有一个具有3个功能的对象;func、funcSuccess 和 funcFailure。func 包含一个jQuery ajax 请求,this.funcSuccess 作为成功回调,funcError 作为错误回调。func 被传递了一个回调,以便将任何成功值传递回,但是这个回调需要在 funcSuccess 代码中执行。

这是代码:

var Obj =

  { func: function (callback) {
      $.ajax(
        { type: 'POST'
        , url: '/func'
        , success: this.funcSuccess
        , error: this.funcError
        }
      )
    }

  , funcSuccess: function (res) {
      // THIS IS WHERE CALLBACK IS NEEDED
      callback(res.thing)
    }

  , funcError: function (res) {
      debug(res)
    }

  }

我想知道是否有一种更整洁的方法来做到这一点,而不是:

var that = this
$.ajax(
  { type: 'POST'
  , url: '/func'
  , success: function (res) {
      that.funcSuccess(res)
    }
  , error: this.funcError
  }
)

很确定我错过了一些明显的东西,只是今天不完全......

4

2 回答 2

1

将回调显式存储在对象中怎么样,这样您就不必担心闭包范围:

var Obj =

  { func: function (callback) {
      //this.callback = callback;
      $.ajax(
        { type: 'POST'
        , url: '/func'
        , success: $.proxy(this.funcSuccess, this, callback)
        , error: $.proxy(this.funcError, this)
        }
      )
    }

  , funcSuccess: function (callback, res) {
      callback(res.thing)
    }

  , funcError: function (res) {
      debug(res)
    }

  }

编辑:我忘记将回调绑定到this. 在 JQuery 中,您可以使用 来执行此操作$.proxy,请参阅上面的更改。

编辑:进一步整洁(jQuery 1.6 允许这样做)将回调作为参数传递给$.proxy,因此无需将其附加到当前对象。

于 2013-01-31T14:30:44.843 回答
0

您需要将 传递给callbackfuncSucess否则它将无权访问它。这里通过使用闭包:

var Obj = {
    func: function (callback) {
        return $.ajax({
            type: 'POST', 
            url: '/func',
            success: this.makeFuncSuccess(callback),
            error: this.funcError
        });
    }, makeFuncSuccess(callback) {
        return function funcSuccess (res) {
            callback(res.thing);
        };
    },
    funcError: function (res) {
       debug(res)
    }
};
于 2013-01-31T14:54:42.453 回答