5

私は、AngularJS httpを使用していくつかの(例えば4つの)Ajaxコールを作成している状況があり、コールバックを呼び出してカウンタを増やしたいので、スレッドが完了しました。ブラウザのJavaScriptで同時読み込み/書き込み読み書きの衝突が可能ですか?

JavaScriptはJavaの「同期」キーワードや「揮発性」キーワードに匹敵するものがないため、カウンタをインクリメントしている間に複数のスレッドが衝突し、インクリメントがいくつか失われる可能性があります。

つまり、2つのスレッドが同時に発生し、両方ともカウンタを読み取り、同じ値(たとえば100)を取得します。その後、両方のスレッドがそのカウンタをインクリメントし(101に)、新しい値を格納すると、見逃しています(102ではなく101)。

私はJavaScriptがシングルスレッドであることを知っていますが、例外もあります。

ブラウザでこのような状況が発生する可能性がありますか?その場合、それを防ぐ方法はありますか?

+3

約束のためカウンターは必要ありません。 '$ q.all()'を見てください。 '$ http'は約束を返し、あなたは約束事をまとめて、完了したら完了します。 – charlietfl

+0

AFAIRが私に起きたことはありませんでしたが、私は答えを待っています!良い質問! – shaheer

+1

@mplungjan非常に遅い – shaheer

答えて

4

いいえ、不可能です(衝突は発生しません)。各AJAX呼び出し応答は、JavaScriptメッセージキュー上のメッセージと見なすことができます。 JavaScriptランタイムは、キュー上の各メッセージを処理して、次のメッセージを処理します。つまり、イベントのコールバックを呼び出し、完全コールバック関数(およびそれが呼び出すすべての関数など)を完了してキュー内の次のメッセージに移動します。従って、2つのメッセージ(例えば、AJAX応答)は並行して処理されない。

出典:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/EventLoop

また、私は長年のJavaScriptで働いてきたし、これは、それがどのように動作するかであることを保証することができます。

+0

私はあなたを信じますが、あなたの主張の説明や情報源? –

+0

すばらしいリンク、ありがとう! –

3

JavaScriptはシングルスレッドなので、私はこのようなシーンが発生するとは思わないが、jsがマルチスレッドになる唯一の方法はWebワーカーを使用するときだが、同じ変数を共有しないあなたは合格属性のjsオブジェクトは、i)は、ここで想定していますので、読み取り/書き込みのオーバーラップのいずれかの場合

EDIT考え直し上

があるはず、束を行うだろう機能onCounterIncreamentがあると言いますカウンターがインクリメントするときの操作のカウンターの変更を確認するには$watchか何かタイムアウトfnを使用してください。変化が見逃される可能性があります。

+0

シングルスレッドのものには例外があります。たとえば、いくつかのajax呼び出しが同時に起きたり、マウスイベントなどのようなものが生き残るために並行性が必要な場合は、 –

+0

@VictorGrazi "JavaScriptは非同期である可能性がありますが、WebWorkerを使用しない基本JavaScriptは決してマルチスレッド化されません***MárÖrlygssonの答えを見てください*** " - http://stackoverflow.com/questions/2734025/is-javascript-guaranteed-to-be-single-threaded – mido

関連する問題