![](/img/trans.png)
[英]What is the correct way to call “parent function” from asynchronous callback, NodeJS
[英]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.