简单的客户端的框架模式,以简化做异步的电话?
-
28-10-2019 - |
题
目前,我们正在不使用任何严重的客户边框架,除了jQuery(九.ui+验证+形式的向导的插件).
一个问题,表面几次在我们的码是这样的:
- 我们有一个按钮,发起一个阿贾克斯呼叫服务器。
- 同时呼叫的是,我们显示一个"装载"图标,与有些文字
- 如果服务器回返的结果太快(例如< 200ms),我们"休眠"为200米利斯(使用
setTimeout()
), 防止闪烁的等待的图标和案文. - 后
max(the call returns, a minimal timeout)
, 我们清楚载图标和案文。 - 然后,我们显示一个错误的文本,如果有些问题在阿贾克斯打电话(服务器不回500个,但是一个自定义json,有一个"错误信息"的财产。事实上,我们有时有这样一个酒店的响应每形式的领域...然后我们比赛的错误形成的领域...但我跑题了).
- 在成功的情况下,我们做...事(取决于该情况)。
我试图最大限度地减少代码重复使用,要么写或重新使用的图案/件的守则/框架,这样做。虽然我可能不会开始使用一个完整的新的重型框架只是为了这个使用情况,我仍然想要知道什么我的选择是...也许这样的客户端的框架将有益于其他事情也是如此。如果有一个轻型框架,不需要我把所有我的代码倒挂,我可以使用的只在特定情况下,那么我们实际上可能使用它,而不是重新发明轮子。
我刚刚听说了 Ember.js -它是一个良好的配合为解决这个问题?你会怎么解决呢?
解决方案
$(function(){
var buttonSelector = "#button";
$('body').on({'click': function(evt){
var $button = $(this);
$button.toggleClass('loading');
var time = new Date();
$.get('some/ajax').then(function(data,text,jqXhr){
// typical guess at load work
$button.empty();
$(data).wrap($button);
}).fail(function(data,text,jqXhr){
alert("failed");
}).done(function(data,text,jqXhr){
var elapsed = new Date();
if((elapsed - time) < 200){
alert("to short, wait");
}
$button.toggleClass('loading');
});
}},buttonSelector,null);
});
其他提示
只裹美元.阿贾克斯在自己的功能。这种方式可以实现自己的排队等等。我建议做一个jquery成分这一点。它可以得到相当强大,例如还可以通过http头等。
关于框架,这取决于你的需求。
例如,可以考虑剑道UI,它具有良好的框架,用于创建数据来源:http://demos.kendoui.com/web/datasource/index.html.
工作示例代码 (嗯,几乎)
无论如何,我都在 @defygravity的答案中寻求一些东西 - 他的想法很好,但仍然是伪代码/尚未完全完成。这是我的工作代码(几乎正在工作的演示, ,直到Ajax URL本身,UI调整)
代码和用法示例:
jQuery.fn.disable = function() {
$(this).attr("disabled", "disabled");
$(this).removeClass("enabled");
// Special handling of jquery-ui buttons: http://stackoverflow.com/questions/3646408/how-can-i-disable-a-button-on-a-jquery-ui-dialog
$(this).filter("button").button({disabled: true});
};
jQuery.fn.enable = function() {
$(this).removeAttr("disabled");
$(this).addClass("enabled");
// Special handling of jquery-ui buttons: http://stackoverflow.com/questions/3646408/how-can-i-disable-a-button-on-a-jquery-ui-dialog
$(this).filter("button").button({disabled: false});
};
function AjaxCallbackWaiter(ajaxUrl, button, notificationArea, loadingMessage, errorMessage, inSuccessHandler, inFailureHandler) {
// Every request that takes less than this, will be intentionally delayed to prevent a flickering effect
// http://ripper234.com/p/sometimes-a-little-sleep-is-ok/
var minimalRequestTime = 800;
var loadingIconUrl = 'http://loadinfo.net/images/preview/11_cyrcle_one_24.gif?1200916238';
var loadingImageContent = $("<img class='loading-image small' src='" + loadingIconUrl + "'/><span class='loading-text'>" + loadingMessage + "</span>");
var errorContentTemplate = $("<span class='error ajax-errors'></span>");
var requestSentTime = null;
button.click(clickHandler);
function displayLoadingMessage() {
clearNotificationArea();
notificationArea.html(loadingImageContent);
}
function clearNotificationArea() {
notificationArea.html("");
}
function displayError(message) {
var errorContent = errorContentTemplate.clone(errorContentTemplate).html(message);
notificationArea.html(errorContent);
}
function ajaxHandler(result) {
var requestReceivedTime = new Date().getTime();
var timeElapsed = requestReceivedTime - requestSentTime;
// Reset requestSentTime, preparing it for the next request
requestSentTime = null;
var sleepTime = Math.max(0, minimalRequestTime - timeElapsed);
function action() {
clearNotificationArea();
button.enable();
if (result) {
inSuccessHandler();
} else {
displayError(errorMessage);
inFailureHandler();
}
}
if (sleepTime <= 0) {
action();
} else {
setTimeout(action, sleepTime);
}
}
function failureHandler() {
}
function clickHandler(){
if (requestSentTime !== null) {
logError("Bad state, expected null");
}
requestSentTime = new Date().getTime();
displayLoadingMessage();
button.disable();
$.get(ajaxUrl, 'json').then(ajaxHandler, failureHandler);
}
}
// Usage:
var ajaxUrl = 'FILL IN YOUR OWN URL HERE';
var button = $("#clickme");
var notificationArea = $(".ajax-notification-area");
var waitingMessage = "Doing Stuff";
var errorMessage = "Not Good<br/> Please try again";
$(document).ready(function(){
new AjaxCallbackWaiter(
ajaxUrl,
button,
notificationArea,
waitingMessage,
errorMessage,
function(){
alert("All is well with the world");
},
function(){
alert("Not good - winter is coming");
});
});
不隶属于 StackOverflow