2016-03-08 95 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 *根本不定义与线程相关的任何内容。 –