質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

944閲覧

Web Worker内でのpostMessageメソッドについて

kabatiro

総合スコア20

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2020/08/20 12:32

編集2020/08/20 12:34

下記はワーカーを利用した1~targetの範囲内でxの倍数がいくつあるかを調べるHTMLコードとJSコードです。1つ目のworker.jsの7行目のpostMessageメソッドについてです。postMessageは

other.postMessage(message, target)
・other:送信先ウィンドウ
・message:送信するメッセージ
・target:送信先

のように宣言するものだった思っていたのですが、1つ目のworker.jsの7行目ではいきなりpostMessageメソッドを宣言しています。そしてコードはしっかり動作します。
下記のコードではなぜ送信先ウィンドウを宣言せずにpostMessageメソッドが動作するのでしょうか。
何かわかる方がいらっしゃいましたらよろしくお願いします。

js

1//worker.js 2self.addEventListener('message', function(e) { 3 var count = 0; 4 for (var i = 1, len = e.data.target; i < len; i++) { 5 if (i % e.data.x === 0) { count++; } 6 } 7 postMessage(count);//←ここです。 8});

html

1<!-- worker_client.html --> 2<!DOCTYPE html> 3<html> 4 5<head> 6 <meta charset="UTF-8" /> 7 <title>JavaScript本格入門</title> 8</head> 9 10<body> 11 <form> 12 <input id="target" type="number" value="1000000" />以下: 13 <input id="x" type="number" value="7" />の倍数の個数= 14 <span id="result"></span> 15 <input id="btn" type="button" value="計算" /> 16 </form> 17 <script src="scripts/worker_client.js"></script> 18</body> 19 20</html>

js

1//worker_client.js 2document.addEventListener('DOMContentLoaded', function () { 3 document.getElementById('btn').addEventListener('click', function () { 4 var worker = new Worker('scripts/worker.js'); 5 6 worker.postMessage({ 7 'target': document.getElementById('target').value, 8 'x': document.getElementById('x').value 9 }); 10 document.getElementById('result').textContent = '計算中...'; 11 12 worker.addEventListener('message', function (e) { 13 document.getElementById('result').textContent = e.data; 14 }, false); 15 worker.addEventListener('error', function (e) { 16 document.getElementById('result').textContent = e.message; 17 }, false); 18 }, false); 19}, false);

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

workerはグローバルがwindowの代わりにDedicatedWorkerGlobalScopeオブジェクトとなり
postMessageがそのメソッドだからです。
そういう意味ではself.addEventListenerのselfも省略可能

投稿2020/08/20 12:50

yambejp

総合スコア116835

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2020/08/20 12:51

<script id="myWorker" type="javascript/worker"> addEventListener('message', function(e) { console.log(this); var count = 0; for (var i=1;i<=e.data.target;i++) { if (i % e.data.x === 0) { count++; } } postMessage(count); }); </script> <script> window.addEventListener('DOMContentLoaded', ()=>{ document.querySelector('#btn').addEventListener('click', ()=>{ const blob = new Blob([document.querySelector('#myWorker').textContent]); const worker = new Worker(window.URL.createObjectURL(blob)); worker.postMessage({ 'target': document.querySelector('#target').value, 'x': document.querySelector('#x').value }); document.querySelector('#result').textContent = '計算中...'; worker.addEventListener('message', function (e) { document.querySelector('#result').textContent = e.data; }, false); worker.addEventListener('error', function (e) { document.querySelector('#result').textContent = e.message; }); }); }); </script> <form> <input id="target" type="number" value="1000000" />以下: <input id="x" type="number" value="7" />の倍数の個数= <span id="result">-</span> <input id="btn" type="button" value="計算" /> </form>
kabatiro

2020/08/20 13:27

なるほどです!ありがとうございます! 1つ質問があります。worker.jsのなかにworker_client.jsという名前が出てこないのになぜwork.jsのcountがworker_client.jsに送られるのでしょうか。 追加の質問なのですがもしよろしければ回答よろしくお願いします。
yambejp

2020/08/21 00:05 編集

仮想workerを設定することでインラインのworker処理をしています もちろnworker.jsを外部化して普通の処理をしても構いません
kabatiro

2020/08/21 01:54

なるほどです!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問