2

我正在编写我的代码如下:

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

4 回答 4

3

不是很 javascript 惯用的。看起来更像 .NET 代码。在 javascript 中提供回调的标准方法是将它们作为参数传递。但是,如果您不能修改GetSamples方法的签名,那么我想这种方法也适用于您的情况。我只是不会将它推广到您的所有 API。仅在这种特殊情况下用作解决方法。

于 2012-07-10T06:53:37.447 回答
1

I'll agree with Darin Dimitrov and will suggest to use only one callback. Not two for success and failure. For example:

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

});

By using this approach you are dealing with only one callback and you will be sure that the developers that are going to use your class will not forget to check for errors (that's the idea to put the err attribute on first place).

于 2012-07-10T07:13:46.040 回答
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 deferreds,看看API。IMO 这是处理异步调用的一种非常干净的方式。

于 2012-07-10T06:53:26.130 回答
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/

于 2012-07-10T07:39:41.367 回答