Javascript 如何按顺序执行jQueryAjax调用?
我有一个输入字段。每当输入字段中的文本发生变化时,我都会对process.php进行ajax调用 我需要处理所有的回复。但有些反应来得早,而有些反应来得晚,这取决于输入。因此,响应的顺序与进行ajax调用的顺序不同 现在我通过设置async:false来实现Javascript 如何按顺序执行jQueryAjax调用?,javascript,php,jquery,ajax,Javascript,Php,Jquery,Ajax,我有一个输入字段。每当输入字段中的文本发生变化时,我都会对process.php进行ajax调用 我需要处理所有的回复。但有些反应来得早,而有些反应来得晚,这取决于输入。因此,响应的顺序与进行ajax调用的顺序不同 现在我通过设置async:false来实现 $("#text_input").on("input", function() { var password = $("#text_input").val(); var length = password.length;
$("#text_input").on("input", function() {
var password = $("#text_input").val();
var length = password.length;
$.ajax({
url: "process.php",
type: "POST",
async: false,
data: {
password: $(this).val()
}
}).done(function (data) {
console.log(data);
console.log(password + " : " + length);
}).fail(function( jqXHR, textStatus, errorThrown ) {
alert( "Request failed: " + textStatus + " , " + errorThrown );
});
});
但是我不希望客户端因为async:false而被卡住
$("#text_input").on("input", function() {
var password = $("#text_input").val();
var length = password.length;
$.ajax({
url: "process.php",
type: "POST",
async: false,
data: {
password: $(this).val()
}
}).done(function (data) {
console.log(data);
console.log(password + " : " + length);
}).fail(function( jqXHR, textStatus, errorThrown ) {
alert( "Request failed: " + textStatus + " , " + errorThrown );
});
});
我试着寻找承诺,但不明白它是否可以在这里应用
如何按顺序执行响应?异步的问题恰恰是,即异步,这意味着代码运行时不等待完成。因此,您的所有请求都会转到服务器,一旦它们开始返回,您的代码就会捕获它们并执行它们 如果希望按顺序处理它们,则需要构建一个队列和处理该队列的代码 然后,您应该为响应中应该出现的所有请求分配一个有序编号(这样您就知道响应的正确顺序) 然后,您可以将响应添加到队列中,并调用处理队列的方法,但该方法仅按顺序处理队列,这意味着它仅处理从0、1、2、3等开始的响应。。。因此,如果队列中存在结果5而不是结果0,则不会处理队列,仅当结果0存在时才会处理队列,依此类推 下面是一个示例代码,我还没有测试过它,但应该可以工作,或者至少应该让您了解如何开始:)
var currentOrder=0;
变量队列=[];
函数processQueue(){
//对队列排序
queue.sort(函数(a,b){
var aOrder=a.订单;
var bOrder=b.订单;
if(顺序<边框){
返回-1;
}
如果(顺序>边框){
返回1;
}
//顺序是相等的(这不应该发生)
返回0;
});
if(队列[0]。顺序===当前顺序){
剂量测定(数据);
queue.splice(0,1);//从队列中删除已处理的第一项
currentOrder++;
processQueue();//再次处理队列
}
}
//对数据做点什么
功能剂量测量(数据){
控制台日志(数据);
}
$('#text_input')。在('input',function()上{
$.ajax({
url:'process.php?order='+order,//我们将订单发送到后端,以便在响应中返回
键入:“POST”,
数据:{
密码:$(this).val()
}
}).完成(功能(数据){
//数据应该在某个地方包含顺序,比如说,它是一个json,位于Data.order中
队列推送(数据);
processQueue();
});
});代码>为什么不使用设置超时功能
来设置他们在输入字段上按下某个字母的时间。您可以这样做:
setTimeout(function(){
$.ajax({
url: "process.php",
type: "POST",
data: {
password: $(this).val()
}
}).done(function (data) {
console.log(data);
console.log(password + " : " + length);
}).fail(function( jqXHR, textStatus, errorThrown ) {
alert( "Request failed: " + textStatus + " , " + errorThrown );
});
}, 1000);
这是为了设置超时,一旦按下输入字段,等待1秒,然后在输入字段上完成键入,它将在1秒后生成ajax。假设您只对最新ajax调用的结果感兴趣,您可以将从$.ajax调用返回的值(一个jqXHR对象)分配给一个变量,然后在触发新的请求时中止该请求
比如:
var request = null;
$("#password_input").on("input", function() {
var password = $("#password_input").val();
var length = password.length;
// you can also check the type of the variable, etc.
if (request) {
request.abort();
}
request = $.ajax({
url: "process.php",
type: "POST",
...
生成器可以帮助您使用jQuery组合承诺。这里有一些有用的教程:@BelminBedak正在研究它。你能告诉我他们会怎么申请吗?这可能对你有帮助。如果您有任何方法可以将您所做的一切从服务器端移动到客户端,那么这就是最好的方法。这将使它具有实时性。我希望对输入中的每一个更改都提出请求,并处理所有响应。我能通过您的解决方案实现这一点吗?@user5155835我能问一下原因吗?当您监视文本输入的更改时,这似乎没有多大意义。至少在我看来是这样的…@user5155835和no,当一个新请求在前一个on完成之前被触发时,前一个请求将被取消。很适合在键入时进行搜索:-)@user5155835我不这么认为,用户感兴趣的唯一响应是他或她完成键入时出现的响应。假设用户键入x,我给出建议y。我查看用户是否键入我的建议。所以如果他输入y,我会记录下来。那么对于xy,我给出建议z。并查看用户是否键入z,并记录它。等等最后,我想看看用户输入了多少建议。这就是为什么我需要发出每个请求并处理每个响应。这不是实时的吗?这也是实时的,因为您可以在500毫秒或更短的时间内发出请求。但是如果您不想每个请求发出1个字母,则使用此解决方案更可靠……但也取决于您。@user5155835我添加了一个示例