jQuery Ajax - 不在循环内部工作

时间:2016-03-07 15:52:13

标签: javascript jquery ajax

我一直试图将此问题排序2天。但事情似乎并不适合我。

我附加的代码在循环外工作正常但是当我在循环中使用它时,它根本不能按照我想要的方式工作并将空数组记录到控制台中。

不在一边,使用" async:false"在我的ajax请求中使代码正常工作并在控制台中完全输出数组但是你知道使用" async:false"不推荐使用并完全冻结UI,直到请求未完成。

任何其他解决方案,而不是将async设置为false?

for (var i = 0; i <= splittedURLSLength; i++) {
            var extracted = extractUsername(splittedURLS[i]);
            postData = {'name' : extracted};
            ajaxRequest = $.when( $.ajax({
            url: "/check",
            type: "POST",
            data: postData
            })).then(function(returnedResponse) {
                if (returnedResponse == "1") {
                    resultsArray.push(extracted);
                }   
            });
}
console.log(resultsArray);

3 个答案:

答案 0 :(得分:1)

您遇到的问题是因为您在将resultsArray填充到AJAX请求中的值之前将其记录到控制台中。以下代码将简要介绍如何使用响应中的数据 -

for (var i = 0; i <= splittedURLSLength; i++) {
        var extracted = extractUsername(splittedURLS[i]);
        postData = {'name' : extracted};
        ajaxRequest = $.when( $.ajax({
                          url: "/check",
                          type: "POST",
                          data: postData
                      })).then(function(returnedResponse) {
                          if (returnedResponse == "1") {
                              resultsArray.push(extracted);
                              showResults(resultsArray);
                          }   
                      });
}

function showResults(resultsArray) {
    console.log(resultsArray);
    //Process your resultsArray as per requirement.
}

答案 1 :(得分:1)

由于AJAX请求是异步的,因此在第一个AJAX请求返回之前,您的console.log将会触发。这就是事件循环在Javascript中的工作方式。

您需要将逻辑移动到成功处理程序中:

for (var i = 0; i <= splittedURLSLength; i++) {
        var extracted = extractUsername(splittedURLS[i]);
        postData = {'name' : extracted};
        ajaxRequest = $.when( $.ajax({
        url: "/check",
        type: "POST",
        data: postData
        })).then(function(returnedResponse) {
            if (returnedResponse == "1") {
                resultsArray.push(extracted);
            }
            if(i === splittedURLSLength){
               console.log(resultsArray);
            }
        });

答案 2 :(得分:0)

只是另一个想法来解决它......

var resultsArray[]//Global or should be pass to the function...

myIterate(0);

function myIterate(idx){
    var i = idx;
    if (i < splittedURLS.length){
        var extracted = extractUsername(splittedURLS[i]);
        postData = {'name' : extracted};
        ajaxRequest = $.when( $.ajax({
        url: "/check",
        type: "POST",
        data: postData
        })).then(function(returnedResponse) {
            if (returnedResponse == "1") {
                resultsArray.push(extracted);
                myiterate(i++);
            }   
        });
    }
}
console.log(resultsArray);