:より転載https://www.jianshu.com/p/d66421c826ae
この参照はする高度なガイドを取得します
起源
フェッチ要求がタイムアウトメカニズムネットワークではなく、またメカニズムについて。
日々の開発プロセスは、要求タイムアウトでなく、不要なネットワーク要求をタイムリーに終了を処理するようにしてください。
そこで、我々は達成するために、独自のパッケージを取得する必要があります。
実現
Promise.race(promise1、promise2、...)メソッドはプロミスオブジェクトを返し、限りパラメータはプロミスの解決のいずれか、または拒否されたように、プロミス解決外であっても又は同じ値で拒否されます。
インポートは、コンポーネント{から} REACT」反応; / * * フェッチパッケージを使用して*プロミス、ネットワーク・タイムアウトを有する、機能を終了させる要求 * / クラスNETUTILコンポーネント{延び 静的baseUrlにし =「:// XXXX:81 / API / HTTP」; 静的トークン = '' ; / * * * POSTリクエスト * URL:要求アドレス ・データ:パラメータ(JSONオブジェクト) :*コールバックコールバック関数 * * / (URL、メソッド、paramsは静的fetch_request '=' {) LETヘッダ = { 「受け入れる」:「ファイルアプリケーション/ JSON」、 「タイプのコンテンツ」:「ファイルアプリケーション/ JSON。文字セット= UTF-8'、 'accesstoken' :NetUtil.tokenは、 } 約束しましょう = nullを。 もし(paramsはが== '' ){ 約束 = 新しいプロミス((決意、リジェクト)=> { (NetUtil.baseUrlフェッチ + URL、{メソッド:メソッド、ヘッダ:ヘッダ}) .then(応答が => response.json( )) .then(responseData => 解決(responseData)) .then(ERR => リジェクト(ERR)) }) } 他{ 約束 = 新しいプロミス((決意、リジェクト)=> { フェッチ(NetUtil.baseUrl + URL、{メソッド:メソッド、ヘッダ:ヘッダ、ボディ:JSON.stringify(paramsは)}) .then(応答が => response.json( )) .then(responseData => 解決(responseData)) .then(ERR => リジェクト(ERR)) }) } 戻りNetUtil.warp_fetch(約束)。 } / * * 2つのオブジェクトを作成する*約束、ネットワーク要求より指定された時間よりも、それは最初のネットワークタイムアウトに代わってコールバック約束をタイムアウトになる場合は、他には、タイミングのために責任があります。 * @param {プロミスは}请求返回的約束をフェッチfetch_promise * @Param {数} [タイムアウト= 10000] 単位:MSは、デフォルトのタイムアウトは10秒であって @return戻り*プロミス * / 静的warp_fetch(fetch_promise、タイムアウト = 10000 ){ timeout_fnせ = ヌル; ABORTせ = ヌル。 // タイムアウトを作成約束 LETのtimeout_promise = 新しい新しいプロミス(関数(解決、拒否){ timeout_fn = 関数{() (拒否 '時限アウト' ); }; }); 終了約束を作成します// abort_promise =せて新たな約束(関数(決意、リジェクト){ アボート = 関数(){ 拒否( '请求终止' ); }; }); // 竞赛 せabortable_promise = Promise.race([ fetch_promise、 timeout_promise、 abort_promise、 ])。 // 计时 のsetTimeout(timeout_fn、タイムアウト); // 终止 abortable_promise.abort = 打ち切り。 返すabortable_promise; } } 輸出デフォルト NetUtil。