Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么第二个循环在第一个循环之前执行?_Javascript_Html_Ajax - Fatal编程技术网

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

Javascript 为什么第二个循环在第一个循环之前执行?,javascript,html,ajax,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/entryPara

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

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);
        });
    }
}

var paragraphsArray=new Array();
函数集段落(偏移)
{
偏移量=偏移量*12;
对于(变量i=1;i<13;i++)
{
var parX=i+偏移量;
var testASd=$.get('php/entryparations.php',{idd:parX}).done(函数(段落)
{
//清楚第1段
document.getElementById(“第1段”).innerHTML=“”;
//创建p元素
var pElem=document.createElement(“p”);
设置属性(“id”、“pEntry”+i);
文件.getElementById(“第1段”).appendChild(pElem);
$(“pEntry”+i).案文(第段);
});
}
}
编辑:我删除了第二个循环,因为它是不必要的,出于某种原因,p元素的创建从
I==13
开始,这是一个额外的循环,甚至不应该这样做


由于某种原因,第二个循环首先执行,因此paragraphArray被打印为
undefined
。我设法用
setTimeout()
函数“修复”了顺序,但仍然得到了未定义的消息,而不是值。在第一个循环中,值可以很好地打印出来,但是如果我尝试将其放入
$(“p”).text(段落)我也没有定义。因此,尽管我对执行令的看法是正确的,但问题仍然存在

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

您只能在第一个循环中处理响应

您可以使用
$(“p”).text(段落)仅与本例类似:

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>")
});
var testASd=$.get('php/entryparations.php',{idd:parX}).done(函数(段落){
$(“#结果”)。追加(“”+段落+”

) });

您应该使用此代码。我只是告诉你方法

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

*已更新

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');
}
var paragraphsArray=[];
函数集段落(偏移){
偏移量=偏移量*12;
var请求=0;
对于(变量i=1;i<13;i++){
var parX=i+偏移量;
var testASd=$.get('php/entryparations.php',{idd:parX}).done(函数(段落){
请求++;
段落段落[请求]=段落;
console.log(paragraphsArray[request]);
如果(请求===12){
警报(“第一”);
回调();
}
});
}
}
函数回调(){
对于(变量i=1;i<13;i++){
console.log(第[i]段);
}
警报(“第二”);
}

在第一个循环中运行第二个循环

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');
             }
        });
    }
}
函数设置段落(偏移量){
//段落
var检验=0;
var paragraphsArray=新数组();
偏移量=偏移量*12;

对于(var i=1;这是因为第一个循环正在发送页面请求,这些请求是并行运行的,并且比Javascript的其余部分花费更长的时间来完成。一旦调用
$.get
,下一行Javascript代码将作为
$执行。get
将退出并检索页面。由于某些原因,可能会重复当我到达12时,回调函数没有运行/调用,是不是因为triple=?,即使它运行,出于某种原因,第二个循环也返回未定义的。这就像我的
settimeout()
Solution的问题一样,正如承诺的那样工作,并解释了是什么导致了这个问题。我在这里遇到的一个小问题是(我猜,$.get()paragraphsArray[x]中的延迟可能不是数据库中的第4项,而是第1项、第8项或任何一项。是否有办法解决此问题?从服务器返回
id
段落作为
对象数据
,类似于
paragraphsArray[data.id]=data.paragration;
我尝试在第一个循环中使用段落,因为第二个循环完全没有必要,这是为了克服第一个问题,即:我可以在控制台和alert()消息中打印,但我无法将该值用于我想要的目的,我想将段落值放入
$(“p”)。文本(段落)
不起作用,它将值指定为未定义。@alexandros您到底在哪里尝试过此操作?您可以在第一个周期中执行此操作。在
$之外无法执行此操作。获取
函数。
var paragraphsArray=new Array();函数setparaphs(offSet){offSet=offSet*12;for(var i=1;i<13;i++){var parX=i+offSet;var testASd=$.get('php/entryparages.php',{idd:parX}).done(函数(段落){//clear paragraph1 div document.getElementById(“paragraph1”).innerHTML=“”;//create p elements var pElem=document.createElement(“p”);pElem.setAttribute(“id”,“pEntry”+i);document.getElementById(“段落1”).appendChild(pElem);$(“pEntry”+i).text('teest');});}
很抱歉,我无法键入我的代码和消息,我完全删除了第二个循环,因为它是不必要的,现在是这样的,问题是它很快会转到i==13,并跳过所有其他内容,因为它只生成一个id为的p元素pEntry13@alexandros您刚刚向我们展示了如何在so中不使用注释。已更新您r问题。现在不可能读取代码。