前回の記事「js でのキュー実装の詳細分析 (コード共有)」では、js でのキューの実装について学びました。以下の記事は、Vue におけるルーティング切り替えによる非同期リクエストの終了方法を理解するのに役立ちます。一定の参考値があり、必要な友人は参照できます。お役に立てれば幸いです。
質問:
SPA
モード (など) の開発においてVUE
、現在のルート切り替え時に発生する非同期リクエストを終了する方法。
結果:
リクエストがタイムアウトし、タイムアウトが設定されている場合。多数の非同期リクエストが実行されています。ユーザーが別のページに切り替えても、これらのリクエストは終了しておらず、サーバーが応答したとき、フィードバック結果は現在のページが予期したものではありません。最終的にはユーザーに誤解を与え、不必要な結果を引き起こすことになります。また、web
のパフォーマンス上の問題も発生します。
解決策:
実行したリクエストをキューに格納し、経路切り替え時にキューを終了します。非同期リクエスト。
最初にリクエストを保存するツリーを作成しますQueue
import Vue from "vue"; import Vuex from "vuex"; Vue.use(Vuex); let store = new Vuex.Store({ state: { requests: [], }, }); new Vue({ el: "#app", router: router, render: (h) => h(App), store, });
Useajax
リクエストと終了
var xhr = $.ajax({ type: "POST", url: "xxxsx", data: "", success: function () { alert("ok"); }, }); //xhr.abort() 终止请求 this.$store.state.requests.push(xhr);
エクスプロイトスーパーエージェント
リクエストと終了
const request = require('superagent') var xhr = request('post','/api/xxxx/xxxx') xhr.send(data) //xhr.query(data) //get 传参 xhr.end((err,res)=>{ ...todo... }) //xhr.abort() 终止请求 this.$store.state.requests.push(xhr)
エクスプロイトaxios
リクエスト
import axios from "axios"; var CancelToken = axios.CancelToken; var source = CancelToken.source(); axios .get("/api/xxxxx/xxxxx", { cancelToken: source.token, }) .catch(function (thrown) { if (axios.isCancel(thrown)) { console.log("Request canceled", thrown.message); } else { // 处理错误 } }); // 取消请求(message 参数是可选的) //source.cancel('Operation canceled by the user.'); this.$store.state.requests.push(source);
vue-resource
Request
import Vue from "vue"; import req from "vue-resource"; Vue.use(req); this.$http .get("/someUrl", { before(request) { this.$store.state.requests.push(request); //request.abort(); 终止请求 }, }) .then( (response) => { // success callback }, (response) => { // error callback } );
Usefetch
Request
fetch を使用できないようです監視対象 進行状況と端末リクエストの読み取り。タイムアウト メカニズムや進行状況プロンプトはありませんが、Promise を使用して終了を達成できます
var _fetch = (function (fetch) { return function (url, options) { var abort = null; var abort_promise = new Promise((resolve, reject) => { abort = () => { reject("abort."); console.info("abort done."); }; }); var promise = Promise.race([fetch(url, options), abort_promise]); promise.abort = abort; return promise; }; })(fetch); var xhr = _fetch("/api/xxx/xxxx", { methods: "POST", body: data }); xhr.then( function (res) { console.log("response:", res); }, function (e) { console.log("error:", e); } ); xhr.abort(); //终止 this.$store.state.requests.push(xhr);
これで、リクエストを終了する方法と、保存する方法がわかりました。リクエスト インスタンス、残りはルートをリッスンするだけです
let router = new Router({....}) //每次路由改变之前终止所有的请求实例 router.beforeEach(function (to, from, next) { this.$store.state.requests.forEach(xhr=>xhr.abort()) //终止所有的请求实例 this.$store.state.requests =[] //执行完清空,等待下一次的页面的请求装载 next() })
これは単なる仮説です。自然なリクエストが完了したら、ツリー リクエストの例を手動でリリースするのが最善です。たとえば、ajax リクエストが完了すると、スプライス ストア内のインスタンスは完了します。
[終了]
推奨学習:vue.js チュートリアル
以上がVue で非同期リクエストを終了するためのルーティング切り替えを説明した記事 (コード付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。