我正在编写如下代码:
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 :(得分: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/