特定のHTTP
要求が進行中である間、キャンセルボタンを表示しているReact-Reduxアプリケーションを構築しています。要求が正常に実行されると、UIに結果が表示され、ユーザーがキャンセルボタンを押すと、UIには何か違うものが表示されます。React-Redux Drop HTTPリクエスト
今すぐ私のリクエストを開始し、リクエストが完了したらReduxストアを更新するために、次の機能を使用しています。
export function doFetch(url) {
return dispatch => {
fetch(url)
.then((json) => dispatch({type: types.MY_SUCCESS_ACTION}, json))
.catch((error) => dispatch({type: types.MY_FAILURE_ACTION, error}));
}
}
今、上記のコードでは使用がキャンセルボタンをクリックした場合を処理しません。今やES7はcancelable promisesでいくつかの仕事をしていますが、これは私のユースケースに合っている可能性があります。なぜなら、ユーザーがキャンセルボタンを押したときにキャンセルできるリクエストの約束を参照するからです。
どうしたらいいですか?ユーザーがキャンセルボタンを押すと、現在のHTTP
リクエストを破棄するアクションをディスパッチできるように、何らかの方法が必要です。
ソリューション
import Bluebird from 'bluebird';
Bluebird.config({
cancellation: true
});
fetch.promise = Bluebird;
let curReqPromises = [];
function doFetch(url) {
return dispatch => {
curReqPromises.push(bluebirdRequest(url)
.then((json) => dispatch({type: types.MY_SUCCESS_ACTION}, json))
.catch((error) => dispatch({type: types.MY_FAILURE_ACTION, error}));
}
}
function bluebirdRequest(url) {
return new Bluebird((resolve, reject, onCancel) => {
makeFetch(url)
.then((json) => resolve(json))
.catch((error) => reject(json));
onCancel(() => {
console.log('I was cancelled');
});
});
}
私はBluebirdを使い終わりました。私のソリューションのために私の編集を参照してください。 – frankgreco