簡體   English   中英

Node.js:異步代碼+ js閉包問題

[英]Node.js: trouble with asynchronous code + js closures

我無法適應Node的單線程+異步性質,再加上javascript的函數閉包。

假設我有類似的東西:

function foo(bar) {
    someAsyncFunction(function callback(err) {
        // do stuff with 'bar'
    });
}

如果我遺失了什么,請告訴我。 但我的理解是:

  • 由於關閉, callback引用 bar
  • 但是,如果foobar = 20時被調用一次,那么從第一次調用調用callback 之前再次使用bar = 42 ,那么在第一次調用foo callback bar將為42。 換一種說法:

    1. foo(20) #1
    2. someAsyncFunction(function callback() {}) #1
    3. foo(42) #2
    4. someAsyncFunction(function callback() {}) #2
    5. callback() #1 ------->使用bar = 42
    6. callback() #2 ------->使用bar = 42

我對此是否正確? (如果bar是原始的還是對象,這有關系嗎?)。 如果是這樣,我該怎么做才能確保callback使用正確的bar值(ASIDE從傳遞bar一直向下和向上調用堆棧)? 感謝您的任何幫助。

不,當執行第一個異步回調時, bar仍然是20。 每次調用foo都會獲得自己的bar ,這個bar不受未來foo調用的影響。

這是不正確的。 每次調用foo都會創建一個新bar ,因此每個回調函數都可以訪問不同的bar

如果你想在那里只有一個bar ,聲明它之外的foo讓的每次調用foo共享相同的bar

var bar;
function foo(arg) {
    bar = arg;
    someAsyncFunction(function callback(err) {
        // do stuff with 'bar'
    });
}

這里, foo不會聲明一個新的bar變量,而是設置在更高范圍內聲明的bar的值。

暫無
暫無

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

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