为什么第二个循环在第一个循环之前执行?

时间:2014-05-04 18:30:49

标签: javascript html ajax

所以这可能是一个转贴,但我真的不知道如何解释我的第二个问题。 我有这段代码:

var paragraphsArray = new Array();
function setParagraphs(offSet) 
{
    offSet = offSet * 12;
    for (var i = 1; i < 13; i++) 
    {
        var parX = i + offSet;
        var testASd = $.get('php/entryParagraphs.php', {idd: parX}).done(function(paragraph) 
        {
            //clear paragraph1 div 
            document.getElementById("paragraph1").innerHTML = "";
            //create p elements
            var pElem = document.createElement("p");
            pElem.setAttribute("id", "pEntry"+i);
            document.getElementById("paragraph1").appendChild(pElem);
            $("pEntry"+i).text(paragraph);
        });
    }
}

编辑:我删除了第二个循环,因为它是不必要的,由于某种原因,p元素创建从i==13开始,这是额外的,甚至不应该做。

由于某种原因,第二个循环首先执行,因此paragraphArray打印为undefined。我设法&#34;修复&#34;使用setTimeout()函数的顺序,但我仍然得到未定义的消息,而不是值。在第一个循环中,值打印得很好,但是如果我尝试将它放在$("p").text(paragraph);中,我也会得到未定义的。所以尽管我对执行顺序是正确的,但问题仍然存在!

3 个答案:

答案 0 :(得分:1)

因为首先在ajax调用,在paragraphsArray空间中声明global并使用回调函数,请尝试以下操作:

<强> *更新

var paragraphsArray = [];
function setParagraphs(offSet) {
    offSet = offSet * 12;
    var request = 0;
    for (var i = 1; i < 13; i++) {
        var parX = i + offSet;
        var testASd = $.get('php/entryParagraphs.php', {idd: parX}).done(function(paragraph) {
            request++;
            paragraphsArray[request] = paragraph;
            console.log(paragraphsArray[request]);
            if (request === 12) {
                alert('first');
                callback();
            }
        });
    }
}
function callback() {
    for (var i = 1; i < 13; i++) {
        console.log(paragraphsArray[i]);
    }
    alert('second');
}

答案 1 :(得分:0)

$.get是异步功能。第一个周期只发送请求而不会等待响应,因此第二个周期将在第一个周期后立即开始,而不会得到$.get函数的响应。这就是为什么第二个周期中console.log(paragraphsArray[i]);显示未定义的原因。

你只能处理第一次响应。

您只能使用$("p").text(paragraph);,例如:

var testASd = $.get('php/entryParagraphs.php',  { idd: parX }).done(function(paragraph) {
    paragraphsArray[i] = paragraph;

    console.log(paragraphsArray[i]);
    alert('first');

    $("p").text(paragraph);
});

您不能使用在函数

中分配的变量
function(paragraph) {
    paragraphsArray[i] = paragraph;

    console.log(paragraphsArray[i]);
    alert('first');

    $("p").text(paragraph);
}

在此功能之外。

要达到你想要的效果,你必须使用另一种方法。

HTML将是:

<div id='paragraphs'>
</div>

JS代码:

var testASd = $.get('php/entryParagraphs.php',  { idd: parX }).done(function(paragraph) {
    $("#results").append("<p>"+paragraph+"</p>")
});

你应该使用〜这段代码。我只是告诉你的方法。

答案 2 :(得分:0)

在第一个循环内运行第二个循环。

function setParagraphs (offSet) {
    //paragraphs
    var testing = 0;
    var paragraphsArray = new Array();
    offSet = offSet * 12;
    for (var i=1;i<13;i++) {
        var parX = i + offSet;
        var testASd = $.get('php/entryParagraphs.php',  { idd: parX }).done(function(paragraph) {
            paragraphsArray[i] = paragraph;
            console.log(paragraphsArray[i]);
            alert('first');
            for (var i=1;i<13;i++) {
                 console.log(paragraphsArray[i]);
                 alert('second');
             }
        });
    }
}