0

for ループの最初の (そして唯一の) 実行で値をコメントしました。私が何をするかは問題ではないようです... connection.query の後、私の for ループには常にループをエスケープする値が与えられます。理由はわかりません。もっと例を挙げることができます。何が起こっているのか、どうすれば問題を回避できるのか誰でも知っていますか? この問題があるコードのスニペットを次に示します。私が使用しているnode.jsのmysqlプラグインはこちらです

https://github.com/felixge/node-mysql

for (j=0;j<rows[i].movelimit;j++){
            //j=0
               sql2="SELECT x, y, land FROM map WHERE collision = 0 AND x>"+(lastX-55)+" AND x<"+(lastX+55)+" AND y>"+(lastY-55)+" AND y<"+(lastY+55)+" AND land='"+rows[i].land+"'"+restrictions;
               connection.query(sql2, function(err, move, fields) {
            //j=rows[i]movelimit 
4

1 に答える 1

3

非同期コールバックのようです。したがって、jコールバック関数の範囲外にあるループ変数は、ループが終了する前に割り当てられた最後の値に常に評価されます。ループの予期しない動作については javascriptまたはループ内の JavaScript クロージャー – 簡単な実用例も参照してください。

クロージャを使用します:

function getCallbackFn(index) {
    return function(err, move, fields) {
        ....
        // "index" will always point to the function argument
    };
}
for (j=0;j<rows[i].movelimit;j++) {
    var sql2 = ...
    connection.query(sql2, getCallbackFn(j));
}

より短いインライン IEFE:

for (j=0;j<rows[i].movelimit;j++) (function(j){
    var sql2 = ...
    connection.query(sql2, function(err, move, fields) {
        ....
        // "j" points to the function argument
    });
})(j);
于 2012-07-28T14:21:42.033 に答える