axiosを使ってAPI経由でデータのやり取りをするアプリケーションを作っています。
組み合わせるて順番に実行させる方法についてご教示ください。
概要
下記のようなフォームでTodoを登録し、
登録したものも含めて一覧で表示するとします。
API経由でデータを保存して、保存したデータを含めて表示用に加工された一覧データを取得して更新します。
その場合、APIにリクエストするのは下記の2つを順番に処理します。
- データベースにデータを追加
- データ一覧を更新
実現したい事
API経由で通信中は別の処理ができないようにしたいです。
上記フォームの「送信」ボタンを連続で押されても処理が終わるまでは何もしないようにしたいです。
ソース
下記のようなコンポーネントを用意しました。
多重送信できないように、processing
フラグで管理しています。
APIとのやりとりを行う関数は次のような物を用意しました。
上記フォームとは別に管理画面が用意しておりTodoを操作できる想定です。
そのため、登録時に最新情報を取得する必要があります。
関数名 | 内容 | URL | メソッド |
---|---|---|---|
addTodo() | 投稿文(body )をDBに追加 | http://api.example.com/api/todos | POST |
getTodos() | 保存された内容をDBから取得 | http://api.example.com/api/todos | GET |
js
1<template> 2<div> 3 <div class="form-group row justify-content-center"> 4 <input 5 class="form-control col-sm-10" 6 type="text" 7 name="body" 8 :disabled="processing" 9 /> 10 <button 11 class="btn btn-primary2 col-sm-2" 12 type="button" 13 @click="addTodo" 14 >送信する</button> 15 </div> 16 17 <div class="row justify-content-center"> 18 <div class="col-11"> 19 <div class="table-responsive"> 20 <table class="table"> 21 <thead> 22 <tr> 23 <th class="th-time">時間</th> 24 <th class="th-name">内容</th> 25 </tr> 26 </thead> 27 <tbody> 28 <tr v-for="todo in todos"> 29 <td>{{ todo.created_at }}</td> 30 <td>{{ todo.text }}</td> 31 </tr> 32 </tbody> 33 </table> 34 </div> 35 </div> 36 </div> 37</div> 38</template> 39 40<script> 41export default { 42 name: "TodoComponent", 43 props: { 44 disabled: { 45 type: Boolean, 46 default: false 47 } 48 }, 49 data () { 50 return { 51 body: '', 52 todos: [], 53 processing: false 54 } 55 }, 56 methods: { 57 // todo追加 58 addTodo() { 59 // プロセスが終了していない場合は何もしない 60 if(this.processing) { 61 return false; 62 } 63 // プロセスを始める 64 this.processing = true; 65 66 let self = this; 67 let data = { 68 body: this.body 69 }; 70 71 let url = 'http://api.example.com/api/todos'; 72 axios.post(url, data) 73 .then(function(){ 74 // 実現したい事の2.に書いた一覧の取得 75 // ただし、非同期ではないためこの処理を待たずにfinallyに進んでしまう 76 self.getTodos() 77 }) 78 .catch(function(e){ 79 // 登録できなかった時はエラー 80 console.log('error'); 81 }) 82 .finally(function() { 83 // 登録できてもできなくてもプロセスの状態を元に戻す 84 self.processing = false; 85 }); 86 }, 87 88 // 一覧取得 89 getTodos() { 90 let self = this; 91 let url = 'http://api.example.com/api/todos'; 92 93 axios.get(url, { 94 headers: { 95 "Content-Type": "application/json" 96 }, 97 data: {} 98 }) 99 .then(function(result){ 100 // 一覧を更新 101 self.todos = result.data.todos; 102 }) 103 .catch(function (e) { 104 console.error(e); 105 }) 106 }, 107 } 108 mounted() { 109 // 読み込み時に最新の一覧を取得しておく 110 this.getTodos(); 111 }, 112} 113</script> 114
現状
1の登録時は制止できるのですが、2の一覧取得する処理のgetTodos()
中に実行できてしまいます。
登録処理のaddTodo
のthenの中に書いているので、追加中かどうかは判定できているのですが、getTodos()
の状態は取得することが出来ていません。
axiosの処理の後に、再度axiosを入れ子にする方法はないでしょうか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/10/17 02:48
2019/10/17 14:41
2019/10/17 15:18