簡體   English   中英

node.js回調中的引用

[英]references in node.js callbacks

當一個基本問題出現時,我只是在寫一些測試。 我寫了測試框架的基本框架。 它首先將所有測試(它們的回調)收集在一個數組中,然后在一個單獨的循環中執行它們。 但是這個

//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]();
}

當我運行此示例時,我得到以下信息:

> node test.js
d=(text1)
d=(text2)
v=(2), i=(2)
v=(2), i=(2)

這意味着在回調中,“ v”已分配給最后一個數組的最后一個元素,“ i”已分配給它的最后狀態,而不是在“創建”回調並將其傳遞給“ fnWithCallback”函數時分配給最后一個狀態。 但是,由於在回調函數中已打印出“ d”,因此在調用“ fnWithCallback”時它沒有該元素的值。

“取消循環”循環沒有幫助。

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

結果相同。

有人可以解釋一下並提供解決方案嗎?

使用閉包

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM