AJAX流程化技术
AJAX Streamlining techniques?
我的问题有点抽象。
我们都熟悉AJAX预加载器/旋转器,它们会在AJAX请求发出时出现。我的问题是如何避免这些?
以可排序列表为例。当用户拖放物品时,将调用AJAX来更新订单。
以前,我会弹出一个全屏AJAX旋转器,以防止用户在AJAX调用完成之前做任何事情。
我的问题是,我该如何避免AJAX旋转器并"简化"AJAX请求,以确保如果用户在2秒内发起20个AJAX请求,它们将按顺序执行?
我真的不需要代码示例,只是接受或流行的技术/想法。或者如果我在这里完全偏离了轨道。谢谢
update
使用async javascript库代替这个来实现你想要的
老低于
到目前为止,在使用数组或队列来确保每次加载并返回一个方面,是好的答案。我会像gmail一样把旋转器全部去掉,只在必要的时候给用户发消息。没有必要用这些旋转器交易来打扰用户。反正他们看起来就像个小机器人。下面是我编写的一些代码。
既然我得到了点头,我将解释它的特性。
- 如果发生错误,
- 停止队列
- 当成功发生时继续队列
- 具有上下文 的成功/错误事件处理程序
var queue = [],
doRequest = function(params) {
params.running = true;
$.ajax({
url: params.url,
dataType: 'json',
success: function(d) {
params.success.call(params,d);
queue.unshift(); // Quit counting your change and move along.
if (queue.length > 0) {
doRequest(queue[0]); // Hey buddy, your next.
}
},
error: function(a,b,c) {
params.error.call(params,a,b,c);
alert('"oops"'); // Rick Perry
}
});
},
queueRequest = function(params) {
queue.push(params); // Sir, you'll need to go to the BACK of the line.
if (!queue[0].running) {
doRequest(queue[0]);
}
};
// so to use this little snippit, you just call "queueRequest" like so (over and over)
queueRequest({
url: 'someajax.abc',
success: function(d) {
// let the user know their stuff was saved etc.
// "this" will be the context of the "params"
},
error: function(a,b,c) {
// let the user know something went wrong etc.
// "this" will be the context of the "params"
}
});
您可以创建一个"ajax请求管理器",用于排队(并可能捆绑在一起)等待的ajax请求。我有一个包含许多ajax可更新控件的复杂应用程序,我只在正在更新的控件上显示微调器。因为你的可拖拽列表更新的只是服务器上的东西,所以你可以不使用旋转器。
其中一个选项可能是在客户机上创建某种请求队列。一旦用户对两个项目进行排序,一个项目就被添加到队列中并开始执行。如果在第一次调用完成之前发生了另一次排序,则将其放入队列中,并将在第一次调用完成后执行。
更新:
当执行同步请求时,您肯定应该处理一个用例。在这个阶段,所有ajax请求应该以某种方式存储在隐藏字段中(只是一个想法),并在同步请求本身之前由服务器处理。
我建议你jquery队列,它可以帮助你排队任何东西,如果它ajax请求或动画队列…
这个答案有点抽象,但是看看jQuery Deferred对象:http://api.jquery.com/category/deferred-object/
它可能对您的情况有所帮助,因为它基本上向AJAX调用添加了一些状态信息,您可以随意读取/更新。
- 有一个中心请求q
- 和一个隐藏的旋转器。
中央请求Q有一个中心数组,临时保存所有请求,因此伪代码将是这样的…
var centralQ = []; //holds the entire process Q
var inProc = false; //provides an in Q proc lock
//processes the request one at a time
function reqProc() {
if( centralQ.length == 0 ) {
inProc = false;
return true;
}
inProc = false; //locks it
var req = centralQ[0];
function callBack() {
//error / res processing??
if( req.callback ) {
req.callback.apply( req, arguments ); //calls the request callback
}
window.setTimeout( reqProc, 0 ); //loop backs, uses timeOut to defer the the loop
}
//Your loader???
jQuery.get( req.url, req.data, callBack );
}
function addReq( addRequest ) {
centralQ.push( addRequest );
if( !inProc ) { //does not process if it is already running
reqProc();
}
}
你可能需要做一些错误捕获/重试,但你得到了大致的想法。
全球转轮只需在需要时开始淡化顶部旋转器,并在不需要时淡化它。
这不是为什么,在jquery中有一个async
选项?
使用async: true
将请求排队。
转轮是为了避免重复发送相同的请求。举个例子,有一个选项可以启用和禁用一个功能……如果用户再次点击相同的按钮,您将一次又一次地发送相同的请求。只在这些情况下使用旋转器。
弹出一个大框,以避免访问整个页面…这只是一个愚蠢的想法(无意冒犯)。
使用旋转器,到特定的元素…以某种方式被处理或操纵。对于请求,只需使用async…
- Ajax发布表单序列化,发布引号'
- 序列化数据属性中对象的最可靠方法
- Javascript将数学动画化
- YUI3 IO实用程序是否可以根据给定的内容类型标头值自动序列化数据
- 使用javascript函数在页面初始化后加载jquery
- 如何在GoogleWeb工具包(GWT)中从JSNI调用接口(实例化)
- 未捕获错误:无法在初始化之前调用方法;
- 如何在剑道网格初始化后设置pageSizes
- $(document).height()在刷新时随机化值(Safari 5.1.10)
- 最小化时暂停Javascript动画
- React redux初始化功能,无论状态变化如何
- 为什么可以't Protractor在自动初始化的Angular网站上查找Angular
- 对象未在Javascript中进行字符串化和解析
- 为什么JSON.stringify没有序列化原型值
- 使用 d3.js 可视化数据组的数据技术
- js可视化-此价格图使用了哪些技术
- AJAX流程化技术
- 闭包编译器可以使用链接作为最小化技术吗?
- 模块化如何在技术上解决nodejs中的回调地狱?
- Node.js或其他JS服务器技术是否支持请求之间的本机共享内存而不需要序列化?