react-native fetch 의 구체 적 인 사용 방법
AJAX 시대 에 요청 API 등 네트워크 요청 을 하 는 것 은 모두 XML HttpRequest 나 포 장 된 프레임 워 크 를 통 해 네트워크 요청 을 하 는 것 이 었 다.
현재 발생 하 는 fetch 프레임 워 크 는 더욱 강력 하고 효율 적 인 네트워크 요청 을 제공 하기 위해 생 겨 난 것 입 니 다.비록 현재 브 라 우 저 호 환 문제 가 있 을 수 있 지만 우리 가 Hybrid App 개발 을 할 때 제 가 전에 소개 한 Ionic 과 React Native 는 fetch 로 완벽 한 네트워크 요청 을 할 수 있 습 니 다.
fetch 첫 체험
Chrome 브 라 우 저 에 서 는 fetch 함 수 를 전역 적 으로 지원 합 니 다.디 버 깅 도 구 를 열 면 Console 에서 초기 체험 을 할 수 있 습 니 다.도 메 인 간 요청 의 사용 방법 을 고려 하지 않 고 같은 도 메 인 자원 을 요청 합 니 다.예 를 들 어 제 블 로그 페이지 에서 Console 을 열 어 다음 과 같은 요청 을 합 니 다.
fetch("http://blog.parryqiu.com").then(function(response){console.log(response)})
되 돌아 오 는 데이터:이렇게 해서 네트워크 요청 을 신속하게 완 료 했 습 니 다.우 리 는 돌아 오 는 데이터 도 이전의 XML HttpRequest 보다 풍부 하고 사용 하기 쉬 운 것 을 발 견 했 습 니 다.
fetch 표준 개관
비록 fetch 는 아직 안정 적 인 기준 으로 발표 되 지 않 았 지만,계속 갱신 되 는 표준 설명 에서 우 리 는 이미 많은 좋 은 것 을 포함 하고 있다 는 것 을 발견 했다.
fetch 는 HTTP Method,HTTP Headers,Request,Response 등 대부분의 상용 HTTP 요청 과 HTTP 표준 호 환 을 지원 합 니 다.
fetch 사용
fetch 의 입구 함수 정 의 는 nodemodules/whatwg-fetch.js 파일 중 다음 과 같 습 니 다.
self.fetch = function (input, init) {
return new Promise(function (resolve, reject) {
var request = new Request(input, init)
var xhr = new XMLHttpRequest()
xhr.onload = function () {
var options = {
status: xhr.status,
statusText: xhr.statusText,
headers: parseHeaders(xhr.getAllResponseHeaders() || '')
}
options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL')
var body = 'response' in xhr ? xhr.response : xhr.responseText
resolve(new Response(body, options))
}
xhr.onerror = function () {
reject(new TypeError('Network request failed'))
}
xhr.ontimeout = function () {
reject(new TypeError('Network request failed888888888888'))
}
xhr.open(request.method, request.url, true)
if (request.credentials === 'include') {
xhr.withCredentials = true
}
if ('responseType' in xhr && support.blob) {
xhr.responseType = 'blob'
}
request.headers.forEach(function (value, name) {
xhr.setRequestHeader(name, value)
})
xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)
})
}
이 함 수 는 Network/fetch.js 에서 내 보 내 졌 으 며,최종 적 으로 initializeCore.js 에서 global 로 등 록 된 속성 은 전역 함수 로 변 경 됩 니 다.fetch 가 돌아 온 것 은 Promise 입 니 다.방법 에 따라 XMLHttpRequest.js 의 send->RCTNetworking.ios.js 의 sendRequest->최종 적 으로 원생 단 RCTNetworking.mm 의 sendRequest 방법 을 호출 합 니 다.
관련 질문:
1.왜 fetch 함수 가 timeout 을 설정 할 수 없 습 니까?
fetch 의 timeout 을 설정 하기 위해 서 저 는 다음 과 같은 함 수 를 정의 할 것 입 니 다.
_timeout_fetch(fetch_promise, timeout = 15000) {
let timeout_promise = new Promise(function (resolve, reject) {
setTimeout(() => {
reject('timeout promise');
}, timeout)
});
return Promise.race([
fetch_promise,
timeout_promise
]);
}
그리고 다음 과 같이 호출 합 니 다.
this._timeout_fetch(
fetch(url, requestParams)
.then(response => response.json())
.then(responseData => {
resolve(responseData);
})
.catch(error => {
reject(error);
})
)
시간 초과 가 끝 난 후에 reject 를 정의 합 니 다.이 Promise 와 fetch 를 Promise.race 에 통합 하면 이 두 요청 을 누가 먼저 실행 하 는 지,다른 하 나 는 버 려 집 니 다.이렇게 시간 초과 설정 을 완성 합 니 다.그러나 원본 코드 를 보면 oc 에 시간 초과 설정 이 있 고 js 와 oc 가 통신 할 때 도 이 매개 변 수 를 전 달 했 습 니 다.문 제 는 입구 함수 fetch 에서 나 왔 습 니 다.위 fetch 방법 에 다음 과 같이 추가 해 야 합 니 다.
xhr.timeout = init.timeout || 0;
요청 매개 변수 에 시간 초과 설정 을 할 수 있 습 니 다.예 를 들 어
let requestParams = {
method: method,
header: {
"Content-Type": "application/json;charset=UTF-8",
},
timeout: 1000
};
2.fetch 함 수 는 왜 cancel 을 할 수 없 습 니까?fetch 는 네 이 티 브 엔 드 에서 NSURLSession DataTask 가 보 낸 요청 입 니 다.이것 은 취소 할 수 있 습 니 다.js 단의 XML HttpRequest.js 에서 도 abort 방법 을 발 견 했 습 니 다.호출 은 현재 네트워크 요청 을 취소 할 수 있 습 니 다.문 제 는 fetch 의 인터페이스 함수 에 있 습 니 다.
우선,취 소 를 요청 하려 면 현재 요청 에 대응 하 는 requestId 를 받 아야 합 니 다.요청 의 실행 순 서 는 js 엔 드 시작->OC 에서 Request 를 생 성하 고 requestId 를 받 습 니 다.NSURLSession DataTask 를 이용 하여 요청->requestId 를 리 셋 형식 으로 js 엔 드 에 전송 합 니 다.js 가 이 요청 을 취소 하려 면 abort 방법 을 실행 하면 됩 니 다.
fetch 함수 가 cancel 을 실행 하려 면 이 방법 으로 XML HttpRequest 대상 을 되 돌려 주면 됩 니 다.하지만 그 건 더 이상 Promise 가 아니다.
돌아 오 는 Promise 대상 에 cancel 방법 을 연결 할 수도 있 습 니 다.수정 방법 은 다음 과 같 습 니 다.
self.fetch = function (input, init) {
var xhr = new XMLHttpRequest()
let p = new Promise(function (resolve, reject) {
var request = new Request(input, init)
// xhr ,
})
p.cancel = () => {
xhr.abort()
}
return p;
}
이렇게 호출 할 때 는 비교적 악습 이 있다.다음 과 같다.
let promise = fetch(url);
promise.then(res => {
}).then(res => {
}).catch(err => {
})
promise.cancel() //
fecth().then().then()모드 를 호출 할 수 없습니다.이 로 인해 되 돌아 오 는 Promise 는 더 이상 cancel 에 연 결 된 Promise 가 아 닙 니 다.이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
nginx 에서 사이트 아이콘 표시 설정전단 개발 환경: react:^16.4.1 webpack:^4.16.0 웹 팩 에 favicon. ico 설정 추가: nginx 는 ico 에 대한 지원 을 추가 합 니 다:...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.