2012-04-17 3 views
1

基本的な問題が発生したときにいくつかのテストを書きました。私はテストフレームワークの裸のスケルトンを書いた。まず、すべてのテスト(コールバック)を配列で収集し、後で別のループでそれらを実行します。node.jsコールバックの参照

最後の配列の最後の要素に割り当てられているとされてきたコールバック「V」に意味
> node test.js 
d=(text1) 
d=(text2) 
v=(2), i=(2) 
v=(2), i=(2) 

「私は」に:私はこのサンプルを実行する場合ただし、これは

//test.js 
var testArray = [ 
    { 
    n : 1, 
    d : 'text1' 
    }, 
    { 
    n : 2, 
    d : 'text2' 
    } 
]; 

var cbs = []; 
function fnWithCallback(d, cb) { 
    console.log('d=('+d+')'); 
    cbs.push(cb); 
} 

for(var i=0; i < testArray.length; i++) { 
    var v = testArray[i]; 

    fnWithCallback(v.d, function() { 
    console.log('v=('+v.n+'), i=('+i+')'); 
    }); 
} 

for(var j=0; j < cbs.length; j++) { 
    cbs[j](); 
} 

私はこれを取得しますコールバックが '作成され'、 'fnWithCallback'関数に渡されたときではなく、最後の状態です。ただし、 'd'はコールバック内に出力されるため、 'fnWithCallback'が呼び出されたときに要素の値が返されます。

"Unlooping" ループは役立ちません。

var v = testArray[0]; 

fnWithCallback(v.d, function() { 
    console.log('v=('+v.n+')'); 
}); 

v = testArray[1]; 

fnWithCallback(v.d, function() { 
    console.log('v=('+v.n+')'); 
}); 

も同様の結果になります。

誰かがこれを説明し、解決策を提供することはできますか?

答えて

1

クロージャを使用し

fnWithCallback(v.d, (function(v,i){ 
    return function() { 
     console.log('v=('+v.n+'), i=('+i+')'); 
    }; 
})(v,i))); 
+0

完全に正常に動作します、ありがとう!他の読者には欠けている ')' - それは}})(v、i))));最後の行で – forste

+0

whoops ..固定それ;-) – micha

+0

ちょうど短い説明(または読書へのリンク)を与えることができますか?クロージャーに値渡しされた値です、クロージャーではなぜ機能しますか? – forste

関連する問題