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

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

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

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

非同期処理

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

3826閲覧

Javascript 非同期処理終了後に別の処理を行いたい

okiron9619

総合スコア5

JavaScript

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

非同期処理

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/11/09 16:17

前提・実現したいこと

Leafletを用いて、マップを描画し、クリックイベントを実装しています。
クリックイベントでは、ajax通信にて、pythonでデータベースの更新、参照を行い、javascriptにて、扱っています。

概略の実現したいことを以下に記述します。(わかりにくいかもしれません、すみません)

A()→データベースaの内容Aを内容Bに更新
B()→データベースaの内容を参照

A(),B()をクリックイベント関数内にて、実装した時に、
B()で、データベースaの内容Bを参照したいのですが、内容Aを参照している状況です。

以下の自分のソースコードでは、postVisitedNode()の処理が完了次第(レスポンス返答後)、achievement_rate()の処理を行いたいです。

該当のソースコード

javascript

1一部省略しているところがあります。(レイヤーやオプションなど) 2onEachNodeFeature = function(feature, layer) { 3 layer.on('click', function(e) { 4 let visited = e.target.feature.properties.visited 5 postVisitedNode(visited.node_id);//隣接ノード描画 6 achievement_rate();//達成率の更新 7 L.DomEvent.stopPropagation(e); 8 }) 9} 10 11function showVisitedListLayer(geojson) { 12 // visitedListLayer上のマーカをクリアする. 13 if (visitedListLayer != null) { 14 mymap.removeLayer(visitedListLayer); 15 } 16 17 // マーカを生成する. 18 visitedListLayer = L.geoJSON(geojson, { 19 pointToLayer: function(feature, latlng) { 20 switch (feature.properties.visited.state) { 21 case 2: return L.circleMarker(latlng, visitedMarkerOptions); 22 case 1: return L.marker(latlng, {icon:pulsingIcon2}); 23 case 0: return L.circleMarker(latlng, unvisitedMarkerOptions); 24 } 25 }, 26 onEachFeature: onEachNodeFeature, 27 }); 28 // マップレイヤにvisitedListLayerを追加する. 29 visitedListLayer.addTo(mymap); 30} 31 32function postVisitedNode(node_id) { 33 $.ajax({ 34 url: 'visit/', 35 method: 'GET', 36 data: { 37 'node_id': node_id, 38 }, 39 timeout: 10000, 40 dataType: "json", 41 }).done(function(response) { 42 let geojson = response; 43 showVisitedListLayer(geojson); 44// console.log(geojson); 45 }).fail(function(response) { 46 window.alert('postVisitedNode() : レスポンス失敗'); 47 }); 48} 49 50function achievement_rate() { 51 $.ajax({ 52 url: 'achievement_rate/', 53 method: 'GET', 54 data: { 55 }, 56 timeout: 10000, 57 dataType: "json", 58 }).done(function(response) { 59 let geojson = response; 60 showachievementLayer(geojson); 61// console.log(geojson); 62 }).fail(function(response) { 63 window.alert('achievment_rate() : レスポンス失敗'); 64 }); 65}

試したこと

非同期通信になっているのは、ajax通信を用いている、API通信を用いている、のどちらかだとおもうのですが、、、
完了を待つ方法として、promise,async/awaitを使う方法があるのは分かったのですが、
クリックイベント内(onEachFeatureオプション内)にて上手く実装することができませんでした。
ご教授していただけたら幸いです。

補足情報(FW/ツールのバージョンなど)

leaflet1.7.1
python3.7

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

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

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

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

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

guest

回答3

0

この程度の規模なら普通にajaxのdoneで呼び出せば良いのでは…?
成否に関わらず実行したいならalwaysですね。

投稿2020/11/09 18:23

kairi003

総合スコア1332

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

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

0

ベストアンサー

こんな感じでしょうか。
postVisitedNode関数でDeffered(promiseオブジェクトみたいなもの)を返すようにして、それを使ってpostVisitedNode関数が完了したときに実行する内容を登録すればいいと思います。

ちなみに$.ajax()はjavascript標準のPromiseオブジェクトではなく、それに似たDefferedというオブジェクトを返します。
(jqueryが開発されていた当時はまだjavascript標準のPromiseが無かったため、独自実装されたものです)
doneやfailは標準のPromiseオブジェクトに準拠していない古いメソッドなのでthen、catchを使ったほうがいいと思います。

javascript

1function postVisitedNode(node_id) { 2 return $.ajax({ // ●関数は、やがてajax処理とthenブロックの処理が完了することを示すDefferedオブジェクトを戻す 3 url: 'visit/', 4 method: 'GET', 5 data: { 6 'node_id': node_id, 7 }, 8 timeout: 10000, 9 dataType: "json", 10 }).then(function(response) { // ●doneではなくthenを使う 11 let geojson = response; 12 showVisitedListLayer(geojson); 13// console.log(geojson); 14 }).catch(function(response) { // ●failではなくcatchを使う 15 window.alert('postVisitedNode() : レスポンス失敗'); 16 }); 17} 18 19postVisitedNode(visited.node_id).then(function() { // ●postVisitedNodeの処理が完了したときに実行する内容を登録する 20 achievement_rate(); //達成率の更新 21});

投稿2020/11/10 02:17

ku__ra__ge

総合スコア4524

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

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

okiron9619

2020/11/10 05:05

ku__ra__ge様 丁寧な説明、回答ありがとうございます。 質問に質問を重ね申し訳ありませんが、2点質問があります。 1.回答していただいたコードのajax通信部分の return $.ajax({ // ●関数は、やがてajax処理とthenブロックの処理が完了することを示すDefferedオブジェクトを戻す url: 'visit/', …… 上記のreturnは、postVisitedNodeの処理が完了したかどうかを判定するための戻り値として、必要という理解であっていますでしょうか。 2.今回の場合とは少し異なりますが、 A()→データベースaの内容Aを内容Bに更新 B()→データベースbの内容Cを内容Dに更新 C()→データベースaから内容Bを、データベースbから内容Dを参照する 上記のような場合、A(),B()は非同期で終了後C()を実行のような形にする時 単純ですが、A()終了後、B()を実行、B()終了後C()を実行のように同期通信のような形が思いつくのですが、微妙のような気がします。 この場合は、他の方が回答していただいたようなコードの実装が必要なのでしょうか。 重ね重ねの質問となり、申し訳ありません。
ku__ra__ge

2020/11/10 08:01

> 上記のreturnは、postVisitedNodeの処理が完了したかどうかを判定するための戻り値として、必要という理解であっていますでしょうか。 はい、そういうことです。 > A()終了後、B()を実行、B()終了後C()を実行のように同期通信のような形が思いつくのですが、微妙のような気がします。 そういった場合$.whenを使います。js標準のPromiseだとPromise.allにあたる処理です。 以下urlはまさにそうった例を説明しています。 https://www.tam-tam.co.jp/tipsnote/javascript/post5807.html
guest

0

jQueryなら$.ajaxでdoneで処理。
複数つかうなら$.Defferedや$.whenなども有効
jsならfetchでいけますが複数ならPromise.allなどを絡めます

投稿2020/11/10 00:19

yambejp

総合スコア116724

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問