传递回调的正确方法是什么?

时间:2012-07-10 06:51:35

标签: javascript jquery callback

我正在编写如下代码:

var MyLib = (function (window, $, undefined) {
    return {
        URI: 'http://testpage/API/',
        OnSuccess: function (data, status) { },
        OnError: function (request, status, error) { },
        MakeRequest: function (method, args) {
            $.ajax({
                type: 'POST',
                url: this.URI + '/' + method,
                contentType: 'application/json; charset=utf-8',
                data: args,
                dataType: 'json',
                success: this.OnSuccess,
                error: this.OnError
            });
        },
        GetSamples: function (data1, data2) {
            var args = {
                data1: data1,
                data2: data2
            };
            this.MakeRequest('GetTestData', JSON.stringify(args));
        }
   };
} (this, jQuery));

因此,如果我想调用AJAX调用,我会这样做:

function OnSuccess(data, status) {
   // ...
}

function OnError(request, status, error) {

}

MyLib.OnSuccess = OnSuccess;
MyLib.OnError = OnError;
MyLib.GetSamples("data1", "data2");

我不想更改GetSamples的签名,因此我选择按上述方式实现它。关于这是否是一种可接受的方法(或如何改进)的任何建议?

4 个答案:

答案 0 :(得分:3)

不是非常简单的javascript惯用语。看起来更像.NET代码。在javascript中提供回调的标准方法是将它们作为参数传递。但是如果你不能修改GetSamples方法的签名,那么我想这种方法也适用于你的情况。我只是不想将它概括为所有的API。仅在此特定情况下用作解决方法。

答案 1 :(得分:1)

你也可以返回jQuery AJAX对象,并在你使用请求的地方调用.done()。

像:

var MyLib = (function (window, $, undefined) {
    return {
        URI: 'http://testpage/API/',
        OnSuccess: function (data, status) { },
        OnError: function (request, status, error) { },
        MakeRequest: function (method, args) {
            return $.ajax({
                type: 'POST',
                url: this.URI + '/' + method,
                contentType: 'application/json; charset=utf-8',
                data: args,
                dataType: 'json'
            });
        },
        GetSamples: function (data1, data2) {
            var args = {
                data1: data1,
                data2: data2
            };
            return this.MakeRequest('GetTestData', JSON.stringify(args));
        }
   };
} (this, jQuery));

然后:

function OnSuccess(data, status) {
   // ...
}

function OnError(request, status, error) {

}

MyLib.GetSamples("data1", "data2").done(OnSuccess).fail(OnError);

这些被称为jQuery延迟,请看API。 IMO这是一种非常干净的异步调用方式。

答案 2 :(得分:1)

我同意Darin Dimitrov,并建议只使用一次回调。成功和失败不是两个。例如:

MyLib.GetSamples("data1", "data2", function(err, response) {

});

通过使用这种方法,您只处理一个回调,并且您将确保将要使用您的类的开发人员不会忘记检查错误(这是将err属性放在第一位的想法)。

答案 3 :(得分:1)

有趣的话题。我看到很多JavaScript开发人员做了这样的事情:

(function ($, window, document) {

  "use strict";

  var App = (function () {

    function App() {
      this.url = 'http://testpage/API';
      this.debug();
    }

    App.prototype = {

      url: 'http://testpage/API',

      success: function (data, status) {},

      error: function (req, status, err) {},

      request: function (command, options) {
        $.get({
          type: 'POST',
          url: this.url + '/' + command,
          contentType: 'application/json; charset=utf-8',
          data: options || {},
          success: this.success,
          error: this.error
        });
      },

      getSample: function (data1, data2) {
        this.request('getTestData', JSON.stringify({
          data1: data1, data2: data2
        }));
      }


    };

    return App;

  })();


})(jQuery, window, document);

我猜测使用了原型方法,因此如果您需要应用程序在页面中包含多个实例,则无需重新定义方法。

还有一点需要注意的是,在JavaScript中,主要的命名约定是camelCase。我的一位同事在Backbone.js中编写了一个模式列表,它也适用于JS设计模式。 http://ricostacruz.com/backbone-patterns/