2016-03-08 137 views
0

節點和異步編程的新手段。調用一個函數來填充兩個不同的異步調用中的數組有問題嗎?我正在談論的一個簡單示例是:兩個異步函數調用填充相同的數組?

var myArray = []; 

function filler(n) { 
    return new Promise(function (resolve, reject) { 
     for (var i = 0; i < 10; i++) { 
      myArray.push(n + i); 
     } 
     resolve(); 
    }); 
} 

filler(3).then(function() { 
    console.log('Done with filler passing 3'); 
}); 

filler(10).then(function() { 
    console.log('Done with filler passing 10'); 
}); 

setTimeout(function() { 
    console.log(myArray); 
}, 3000); 

這兩個異步調用都可能試圖在相同的時間推送到myArray。有沒有問題,或者是否node.js優雅地處理?它運行時,我運行它,但我不知道如果我只是幸運,沒有碰撞。

+0

JavaScript是單線程。沒有併發問題。 – Tomalak

+0

@Tomalak:JavaScript不是單線程的。 NodeJS是,但。 –

+0

哪些引擎不是? – Tomalak

回答

1

這兩個異步調用都可能試圖在相同的時間推送到myArray。

JavaScript併發模型指定了一個非阻塞事件循環。一次只有一個正在執行的事件,並且沒有事件可以在其間運行。事件以可預見的順序發生。有了這個模型,JavaScript就沒有您在有線程時可能會遇到的併發問題。

有關詳細閱讀:https://developer.mozilla.org/en/docs/Web/JavaScript/EventLoophttps://en.wikipedia.org/wiki/JavaScript#Miscellaneous

+0

*「JavaScript沒有並行性問題,當您有線程時,您可能會遇到併發問題。」*對於NodeJS(單線程)和瀏覽器(它們隔離線程)而言,這是正確的,但在語言級別則不正確。該語言沒有提到線程或併發性。環境可以(有些可以)具有真正的多線程,並且可以在其他語言中看到相同的併發問題。 –

+0

@ T.J.Crowder你能舉一個例子嗎? – Halcyon

+0

查看對問題的評論。我的主要觀點是:JavaScript *,語言,對線程的話題保持沉默。單線程或多線程是運行環境的特徵,* language *根本不定義與線程相關的任何內容。 –