2016-09-29 13 views
0

私はJavaScriptがマルチスレッド化されているように見えますが(少なくともそれは私が理解している方法ですが)、JavaScriptが実際にどのようにシングルスレッド化されているかについていくつかの研究を行っています。他の関数が呼び出されます。JavaScriptリスト操作は同期していますか?

私はそれがかなり確信していますが、push()を呼び出すと、呼び出されたときに他の関数が最初に実行される可能性があることを心配しています。それは言われている、私はpush()で実行される長い実行コードの任意の並べ替えを考えることはできません。 push含む

// adds a new node to children, after checking if its UID is not in childrenAdded 
this.addChild = function(newChild) { 
    if (!_this._childrenAdded[newChild.uid]) { 
     _this._childrenAdded[newChild.uid] = true;    
     _this._children.push(newChild); 
    } 
} 
+0

「this.addChild」がどのように呼び出されているかわかりませんが、大括弧でメンバーにアクセスして配列にプッシュするコードの残りの部分は、確かに**同期**です。基本的に、タイマー、Ajax、その他のリクエストのみがクライアント側で非同期です。JS – adeneo

+0

このコードとは非同期ではありません。 – epascarello

答えて

1

すべてArray方法は、同期しています。これはJSのすべての操作のほとんどのデフォルトですが、非同期は例外であり、そのようなすべての関数で文書化されています。

1

関数が非同期の場合、通常はパラメータとしてコールバック関数が使用されるか、Promiseなどが返されます。

こうすれば、関数が終了した後にコードが実行されるようにすることができます。

あなたの質問に答えてください:プッシュは同期です! :)

+0

"関数が非同期の場合、通常はパラメータとしてコールバック関数を使用します" - これは良い指標ではありません。例えば、 'Array.prototype.sort'と' Array.prototype.forEach'は引数として関数を取りますが、同期しています。 – Quentin

+0

ええ、どんな種類のドキュメンテーションを見たり、これらの関数がどのように機能するか(一般的には、それらを使用する必要がある)を概観すれば、これらの関数のパラメータはコールバックではありません全く異なる目的を持っています。私は「関数がパラメータとして解析されるたびにコールバック関数です」とは言っていませんでした) – jdepoix

0

アレイプッシュ方式は同期方式です。舞台裏で何が起こっているのかを理解するには、this video on the javascript event loopを見ることを強くお勧めします。

十分な時間を見れば、「マルチスレッドのように見えますが、シングルスレッドの」JavaScriptの一部がどのように機能するかを明確にする必要があります。それともあなたをもっと混乱させるかもしれないが、ねえ、それはあなたのためのjavascriptだ!

1

すべてがJavascriptで同期しています。それは振る舞い、非同期に見えるかもしれませんが、それはJavaScriptのすべてが実行スタックに置かれているからです。何かが終了すると、スタックからポップされます。

イベントがある場合は、イベントループにプッシュされます。すべてが実行スタックからポップされると、イベントループを検索して実行するものがあるかどうかを調べます。そうであれば、そのイベントを実行します。非同期に見えるかもしれませんが、実際はそうではありません。結論としては、

です。 JavaScriptは同期です。

関連する問題