2012-07-10 64 views
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签名因此我选择如上所述来实施它。任何关于这是否是可接受的方法(或如何改进这一点)的建议?

+0

对我来说很不错 – 2012-07-10 06:54:05

回答

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。海事组织这是一个非常干净的方式来处理异步调用。

3

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

1

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

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

}); 

通过使用这种方法,你所处理的只是一个回调,你一定会认为这要使用你的类开发商也不会忘记检查错误(这是把这个想法首先是err属性)。

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/

相关问题