fetch 차단기 구현
//bread-fetch.js
var oldFetch = global.fetch
var newFetch = function (url, options={}) {
let request = {
url,
options
}
return new Promise((resolve, reject) => {
if (this.interceptors.length > 0) {
//
this.runInterceptors(0, request)
.then(req => {
oldFetchFun(this,req)
.then((res)=>{
resolve(res);
})
.catch(err => {
reject(err)
});
})
} else {
oldFetchFun(this, request)
.then((res)=>{
resolve(res);
})
.catch(err => {
reject(err)
});
}
});
}
var oldFetchFun = function (that, request) {
return new Promise((resolve, reject) => {
//
var timeout = request.options.timeout
var timer
if (timeout) {
timer = setTimeout(function(){
reject(new Error("fetch timeout"))
}, timeout );
}
console.log('oldFetch request',request)
oldFetch(request.url, request.options)
.then(res=>{
console.log('oldFetch res',res);
return res.json();
})
.then(res => {
console.log('oldFetch res json',res)
//
let response = res
if (that.interceptors_after.length > 0) {
that.runInterceptorsAfter(0, response)
.then(data => {
resolve(data);
})
}
})
.catch(err => {
console.log('err',err)
reject(err)
});
})
}
var breadFetch = function () {
}
breadFetch.prototype.newFetch = newFetch
//fetch
breadFetch.prototype.interceptors = []
breadFetch.prototype.interceptors_after = []
breadFetch.prototype.runInterceptors = function (i, request) {
var _that = this
if(i===0) this.interceptors_after = []
return new Promise((resolve, reject) => {
if (i >= this.interceptors.length) resolve(request)
this.interceptors[i](request, function (callback) {
if(callback){
//callback
_that.interceptors_after.push(callback)
}
_that.runInterceptors(++i, request).then(req => {
resolve(req)
})
})
})
}
breadFetch.prototype.runInterceptorsAfter = function (i, response) {
var _that = this
return new Promise((resolve, reject) => {
if (i >= this.interceptors_after.length) resolve(response)
this.interceptors_after[i](response, function () {
_that.runInterceptorsAfter(++i, response).then(res => {
resolve(res)
})
})
})
}
let objFetch = new breadFetch()
let fetch = function (url, options = {}) {
return new Promise((resolve, reject) => {
objFetch.newFetch(url, options)
.then(data => {
resolve(data);
})
.catch(err => {
reject(err)
});
})
}
export default objFetch
export { fetch }
원 리 는 매우 간단 합 니 다. 원생 의 fetch 를 밀봉 하고 두 개의 배열 을 유지 하 며 요청 전의 작업 과 요청 후의 작업 을 각각 저장 하고 새로운 fetch api 로 요청 하 며 순서대로 이 작업 을 수행 하여 데 이 터 를 차단 합 니 다.
사용 예시:
//index.js
import storage, { MyStorage } from './storage/storage';
import breadFetch, { fetch } from './util/bread-fetch'
global.fetch = fetch
//fetch token url token
breadFetch.interceptors.push((req, next) => {
console.log('interceptors1')
if (req.url.includes('/api/login') || req.url.includes('/api/signup')) {
next()
return
}
MyStorage.load('login-token',(token)=>{
console.log('login-token',token)
if (req.url.includes('?')) {
req.url = req.url + '&token=' + token
} else {
req.url = req.url + '?token=' + token
}
next()
},() => {
console.log('not found token, please login')
},() => {
console.log('token expire')
})
})
breadFetch.interceptors.push((req, next) => {
console.log('interceptors2')
next()
})
breadFetch.interceptors.push((req, next) => {
console.log('interceptors3')
next((res, after) => {
console.log('interceptorsAfter1')
after()
})
})
breadFetch.interceptors.push((req, next) => {
console.log('interceptors4')
next((res, after) => {
console.log('interceptorsAfter2')
// if (res.body.code === 302) {
// window.location = res.body.uri
// }
after()
})
})
//signin.js
export function login (username, password) {
return (dispatch, getState) => {
return new Promise((resolve, reject) => {
let params = { username, password }
console.log('params',params)
fetch(`${config.host}:${config.port}/api/login`, {
method: 'post',
headers: {
//'Accept': 'application/json, text/plain, */\*',
'Accept': 'application/json',
'Content-Type': 'application/json'
//'Content-Type': 'application/x-www-form-urlencoded'
},
body: JSON.stringify(params)
})
// .then(res=>res.json())
.then((data) => {
console.log('data',data)
dispatch(signinResult(data.success))
if (data.success) {
MyStorage.save('login-token',{token: data.token})
resolve()
}
})
.catch((err) => {
console.warn(err);
})
.done();
})
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.