Javascript 如何按顺序执行jQueryAjax调用?

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;

我有一个输入字段。每当输入字段中的文本发生变化时,我都会对process.php进行ajax调用

我需要处理所有的回复。但有些反应来得早,而有些反应来得晚,这取决于输入。因此,响应的顺序与进行ajax调用的顺序不同

现在我通过设置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 );
    });

});
但是我不希望客户端因为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我添加了一个示例