繁体   English   中英

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

[英]What is the correct way of passing a 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的签名,因此我选择了如上所述的实现。 关于此方法是否可以接受(或如何改进)的任何建议?

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

您还可以返回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,这是处理异步调用的一种非常干净的方法。

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

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

});

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

有趣的话题。 我看到许多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/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM