提问人:Danish Naseem 提问时间:2/12/2022 最后编辑:Rory McCrossanDanish Naseem 更新时间:2/12/2022 访问量:283
如何通过回调将一个 AJAX 处理程序用于多种用途?
How to use one AJAX handler for multiple purposes with callbacks?
问:
我在一个对象中写了一段代码。您可以看到一个对象,其中包含用于添加新客户的函数和用于进行 AJAX 调用的方法customers
var sys = {
customers: {
addNew: function(ref, cb = null) {
if (!cb) { // so it can check if the call to this method was for requesting ajax request or handling its response . note i am sending the callback function reference same as the current
core.request({
d: $('form').serialize()
}, 'sys.customers.addNew', ref);
} else {
if (ref.status) {
$('.customers-list').append('<li>' + ref.customer.name + '</li>');
alert('success')
}
}
},
updateRowAfterAdd: function() {
// or i could use this for handling callback by passing its reference instead of the upper same function
}
},
request: function(p = {}, c = null, e = false) {
$.ajax({
url: "/to/my/server",
data: {
p: p
},
type: 'post',
dataType: 'json',
beforeSend: function() {
},
success: function(r) {
if (c != null)
(e ? eval("(" + c + "(r,e));") : eval("(" + c + "(r));"));
}
});
}
}
$(document).on('click', '.addNew', function() {
sys.customers.addNew($(this));
});
此示例中的想法是通过传递用于处理响应的回调函数引用来调用 AJAX 方法。success
如果你看一下这个方法,它以两种方式工作。在第二个参数 的帮助下,它确定对此函数的调用是为了发送 AJAX 请求或处理其响应。addNew()
cb
我在回调中使用我知道是邪恶的,所以我想了解如何在不使用的情况下做到这一点?eval()
success
eval()
我的页面上运行了多个需要 AJAX 调用的东西,我不想重写它们中的每一个。
AJAX的方法也需要这个。beforeSuccess()
答:
0赞
Rory McCrossan
2/12/2022
#1
你使用的设计模式似乎是一个不必要的抽象,这导致了它解决的更多问题。
一个更好的主意是有一个中央“服务”层,它向你的服务器端发出请求并处理响应。如果你想进一步抽象它,你可以使用其他领域逻辑抽象来通过单个类处理 AJAX 请求和响应,但是在那个阶段,我认为你最好使用现有的框架来为你做这件事。
强烈建议使用 Angular,因为它的 MVC 模式无论如何都是你要去的地方。
如果你确实想推出自己的简单版本,那么一个简单的例子将如下所示:
$(document).on('click', '.addNew', function() {
services.customers.save($('form').serialize());
});
// in a service layer JS file, far away from UI logic...
let services = {
customers: {
save: requestData => {
$.ajax({
url: '/to/my/server',
type: 'post',
dataType: 'json',
data: $('form').serialize(),
success: services.customers.renderUi
});
},
renderCustomerUi: customerData => {
// optional: extract the UI update logic to your UI layer and pass in the callback as an argument
if (customerData.status) {
$('.customers-list').append('<li>' + customerData.customer.name + '</li>');
}
}
}
}
评论
0赞
Danish Naseem
2/12/2022
是的,我知道我可以在其他框架中实现这一点。但是我想在我使用 jquery 和简单 js 的当前代码中解决这个问题。以及您为我提供的解决方案.我以前见过这个.但这没有帮助,因为作为回应,我有固定的功能处理。因为我想使用动态函数回调
评论
eval
c(r, e)