jquery执行行为

时间:2012-08-01 02:52:19

标签: javascript jquery

$(document).ready(function () {
    $('.out').each(function(index) {
       .ajax({                      
          url: "php,
          type: "GET",
          success: function(data) {
          // LOOP each dynamic textbox for my specific validation
         console.log('1'); // flag if any error
       }
    });

    // I though this will run after  $('.out').each()
    console.log('2'); // my plan is to check if atleast 1 error occur
});

result:
> 2
> 1
> 1
> 1

instead of:
> 1
> 1
> 1
> 2

我认为流程将是,首先运行每个函数将显示1 1 1等,之后它将显示2.可以有人帮助我如何完成我需要的工作吗?

提前致谢

2 个答案:

答案 0 :(得分:1)

正如已经提到的,Ajax是异步的,这意味着你的console.log('2')语句可以在调用成功函数之前执行。

尝试这样的事情:

$(document).ready(function () {
    $('.out').each(function(index) {
       $.ajax({                      
          url: "yourUrl.php",
          type: "GET",
          success: function(data) {
              // LOOP each dynamic textbox for my specific validation
              console.log('1'); // flag if any error
          },
          complete: function (jqXHR, textStatus){
              //This will be be called when the request finishes 
              //(after success and error callbacks are executed)
              console.log('2'); // my plan is to check if atleast 1 error occur
          }
       });
    });
});

看看这里更好地理解jQuery ajax调用: http://api.jquery.com/jQuery.ajax/

答案 1 :(得分:1)

假设您更正了代码中的语法错误(在$之前丢失.ajax,在"值上丢失了url,并且错过了关闭}); $.ajax电话,以及我没有发现的任何其他错误:

$(document).ready(function () {
    $('.out').each(function(index) {
       $.ajax({                     
          url: "php",
          type: "GET",
          success: function(data) {
            // LOOP each dynamic textbox for my specific validation
            console.log('1'); // flag if any error
          }
       });
    });

    console.log('2'); // my plan is to check if atleast 1 error occur
});

然后,执行就绪函数中的语句的顺序首先是.each()将为每个$.ajax()元素调用'.out',然后console.log('2')调用{{1}}将执行end并准备就绪函数,然后稍后将按照浏览器接收到Ajax响应的顺序为每个Ajax请求调用成功函数 - 不一定是Ajax请求的顺序。 (显然这假设他们实际上 成功。)

这是因为Ajax请求(应该是)异步 - 在当前代码块完成后将始终调用响应回调,无论响应收到多快,因为(忽略)网络工作者)JavaScript不是多线程的。