索引超出for循环但是(错误)工作

时间:2017-02-01 17:23:08

标签: javascript arrays json for-loop

这是我在这里的第一个问题,如果我没有正确行事,那就很抱歉。告诉我这是否发生。

我为一个荒谬的简单循环而疯狂。

变量res是sql查询的响应,其中满足条件的ID保存为JSON数组。 JSON.stringify(res)返回[{"id":1},{"id":2}]。这是代码:

    for(var ii = 0; ii <= res.length-1; ii++){
        console.log("res[ii].id: "+res[ii].id); //throws the correct message on console, so ii=1 first and later ii=2.

        laDatabase.all("SELECT * FROM Movies WHERE Movies.id="+res[ii].id+";", function(err, resMovies){
            console.log("resMovies: "+JSON.stringify(resMovies)); //throws the correct message on console, the sql sentence is correct and runs without problem
            if(err){
                console.log("Error en 'SELECT * FROM Movies WHERE Movies.id="+res[ii].id+";'");
                return;
            }else{
                //I tried to move the response of the sql query to the array I'll return. At this point, ii=2 always
                console.log("ii: "+ii);
                jsonArrayRespuesta[ii] = resMovies[0];
                console.log("jsonArrayRespuesta: "+JSON.stringify(jsonArrayRespuesta));//resMovies[0] is saved in jsonArrayRespuesta[2] both times
                console.log("length of jsonArrayRespuesta: "+jsonArrayRespuesta.length);//this shows 3, obviously...
            }//if-else
        });//Movies
    }//for

我很困惑,因为: - 在循环内的一个点ii改变每次迭代,但在另一个点总是2。 -2超出var ii = 0; ii&lt; = res.length-1;但程序运行了。

有人可以告诉我,我做错了什么,为什么?谢谢。

1 个答案:

答案 0 :(得分:0)

广告你的sql查询的结果来了,回调被称为for循环已经完成运行并且ii的值达到了(res.length-1)。

您可以使用clousere解决此问题。

for(var ii = 0; ii <= res.length-1; ii++){
    console.log("res[ii].id: "+res[ii].id); //throws the correct message on console, so ii=1 first and later ii=2.

    (function(res,ii){
    laDatabase.all("SELECT * FROM Movies WHERE Movies.id="+res[ii].id+";", function(err, resMovies){
        console.log("resMovies: "+JSON.stringify(resMovies)); //throws the correct message on console, the sql sentence is correct and runs without problem
        if(err){
            console.log("Error en 'SELECT * FROM Movies WHERE Movies.id="+res[ii].id+";'");
            return;
        }else{
            //I tried to move the response of the sql query to the array I'll return. At this point, ii=2 always
            console.log("ii: "+ii);
            jsonArrayRespuesta[ii] = resMovies[0];
            console.log("jsonArrayRespuesta: "+JSON.stringify(jsonArrayRespuesta));//resMovies[0] is saved in jsonArrayRespuesta[2] both times
            console.log("length of jsonArrayRespuesta: "+jsonArrayRespuesta.length);//this shows 3, obviously...
        }//if-else
    });//Movies
 })(res,ii);

}//for