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

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

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

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

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Q&A

解決済

2回答

1250閲覧

多層構造の配列の最下層の値を使った処理を、非同期で行わずに順番に処理したい。

mayeno26

総合スコア13

JavaScript

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

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

0グッド

0クリップ

投稿2019/02/23 16:02

編集2019/02/24 02:45

「もしかしたらこれでうまくいくのでは?」
というアイデアベースでも大変助かるので、コメントもらえるとありがたいです。。!

起こっている現象・問題

javascriptのfor文の中で、処理が重い関数があるせいで、いくつかの関数処理が間に合わずに処理が終わってしまいます。
具体的にはbing map apiを用いた住所を緯度経度に変換する関数です。

多層構造の配列(下部に例を記載しています)の最下層にある値に対して処理を行う
→処理が完了する
→次の最下層の値に対して処理を行う
→処理が完了する
→次の、、、

といった具合に一回一回の処理が完了してから次の処理へ移ることができれば解決するのでは?と考えたのですが、書き方を調べてもわからず困っています。

わかる方教えていただけると助かります。
これ以外のやり方でもできるものがあれば試したいです。

###問題の繰り返し処理の関数

javascript

1for (let r_key in r_arr){ 2 let p_arr = r_arr[r_key].prefectures; 3 for (let p_key in p_arr){ 4 let s_arr = p_arr[p_key].stores; 5 for (let s_key in s_arr){ 6 var s_address = s_arr[s_key].address; 7 geocodeQuery(s_address, layer); //この処理に時間がかかります。(関数の中身は下記) 8 } 9 } 10}

多層構造の配列

下記の配列のaddressの値に時間のかかる処理を行いたいです。

arr = [ {name:"関東", prefectures:[ {name:"東京", stores:[ {id: 1, address: "東京都・・・"}, {id: 2, address: "東京都・・・"} ]}, {name:"神奈川", stores:[ {id: 3, address: "神奈川県・・・"}, {id: 4, address: "神奈川県・・・"} ]} ]}, {name:"近畿", prefectures:[ {name:"大阪", stores:[ {id: 5, address: "大阪府・・・"}, {id: 6, address: "大阪府・・・"} ]}, {name:"京都", stores:[ {id: 7, address: "京都府・・・"}, {id: 8, address: "京都府・・・"} ]} ]} ]

住所を緯度経度に変換する関数

javascript

1function geocodeQuery(address, layer) { 2 if(searchManager) { 3 //住所から緯度経度を検索 4 searchManager.geocode({ 5 where: address, 6 callback: function (r) { 7 if (r && r.results && r.results.length > 0) { 8 //pinを立てる 9 let pin = new Microsoft.Maps.Pushpin(r.results[0].location, { 10 roundClickableArea: true, 11 }); 12 //layerにpinを追加 13 layer.add(pin); 14 } 15 }, 16 errorCallback: function (e) { 17 console.log(address + 'は変換失敗'); 18 } 19 }); 20 } 21}

以上です。わかりづらい部分あれば補足いたします。
よろしくお願い致します。

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

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

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

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

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

kei344

2019/02/24 02:31

質問文から削除された経緯度を得るコードは非同期で実行されるため、現在の提示内容では解決に到達し得ないと思います。
mayeno26

2019/02/24 02:38

そうだったのですね。。ありがとうございます。 質問を修正致します。
guest

回答2

0

自己解決

根本的な解決には至りませんでしたが、住所以外に緯度経度のデータを別で持ってそれを利用する形にしました。

理由は、bing maps apiの規約において、一回の地図表示においての住所の緯度経度への変換回数に上限があるようでそもそも規約違反になってしまうためです。
bing maps api規約ページ

私の場合は、enterprise版でなく、無料アカウントだったので、上限2回。(経路検索用ですかね)
実際は30回近くやろうとしていたので、大幅超過です。
でも、enterprise版でも上限10回なので、そもそも私の使い方が間違っているようです。

住所の緯度経度への変換処理は重い処理なので、毎回その処理を走らせるのではなく、一度処理したらキャッシュなどを利用し、2度目は変換処理をさせずに前回処理したデータを利用するのがセオリーだ、ってどこかに書いてありましたが、あまりジオコーディングの処理を複数回走らせるのは推奨されていないようです。

投稿2019/02/24 11:42

mayeno26

総合スコア13

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

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

0

javascript

1(function () { 2 let i = 10; 3 let ary = [ ]; 4 (function a () { 5 let j = 10; 6 (function b () { 7 let k = 10; 8 (function c () { 9 ary.push ([i,j,k]); 10 console.log (i, j, k); 11 12 --k && setTimeout (c, 5) || 13 --j && setTimeout (b, 5) || 14 --i && setTimeout (a, 5) || 15 hoge (ary); 16 })(); 17 })(); 18 })(); 19})(); 20 21function hoge (ary) { 22 console.log (ary); 23} 24

投稿2019/02/23 21:27

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問