兼容钉钉环境下不完整的Blob对象原型;修复极端情况下next版本死循环的bug

master 1.1.0
宇天 2021-03-24 11:42:56 +08:00
parent 35deb769d6
commit 6a7099ad2e
3 changed files with 25 additions and 54 deletions

View File

@ -1,6 +1,6 @@
{ {
"name": "@bytedo/fetch", "name": "@bytedo/fetch",
"version": "1.0.2", "version": "1.1.0",
"description": "全新的ajax封装。分2个版本, 一个基于XMLHttpRequest, 一个基于window.fetch", "description": "全新的ajax封装。分2个版本, 一个基于XMLHttpRequest, 一个基于window.fetch",
"main": "dist/index.js", "main": "dist/index.js",
"directories": { "directories": {

View File

@ -6,10 +6,6 @@
import { Format, toS } from './lib/format.js' import { Format, toS } from './lib/format.js'
const noop = function(e, res) {
this.defer.resolve(res)
}
const NOBODY_METHODS = ['GET', 'HEAD'] const NOBODY_METHODS = ['GET', 'HEAD']
const FORM_TYPES = { const FORM_TYPES = {
form: 'application/x-www-form-urlencoded; charset=UTF-8', form: 'application/x-www-form-urlencoded; charset=UTF-8',
@ -286,12 +282,8 @@ class _Request {
} }
__success__(isSucc, result) { __success__(isSucc, result) {
var response = new _Response( var { body, status, statusText, headers } = result
result.status, var response = new Response(body, { status, statusText, headers })
result.statusText,
result.body,
result.headers
)
if (isSucc) { if (isSucc) {
this.defer.resolve(response) this.defer.resolve(response)
@ -304,7 +296,10 @@ class _Request {
} }
__cancel__(result) { __cancel__(result) {
var response = new _Response(0, ERRORS[10100], Object.create(null)) var response = new Response('', {
status: 0,
statusText: ERRORS[10100]
})
this.defer.reject(response) this.defer.reject(response)
@ -314,7 +309,10 @@ class _Request {
} }
__timeout__(result) { __timeout__(result) {
var response = new _Response(504, ERRORS[10504], Object.create(null)) var response = new Response('', {
status: 504,
statusText: ERRORS[10504]
})
this.defer.reject(response) this.defer.reject(response)
@ -324,40 +322,6 @@ class _Request {
} }
} }
class _Response {
constructor(status = 200, statusText = 'OK', data = null, headers = {}) {
this.status = status
this.statusText = statusText
this.ok = status >= 200 && status < 400
this.headers = headers
Object.defineProperty(this, '__R__', {
value: data,
writable: true,
enumerable: false,
configurable: true
})
}
text() {
return this.__R__.text()
}
json() {
return this.__R__.text().then(t => {
return JSON.parse(t)
})
}
blob() {
return this.__R__
}
arrayBuffer() {
return this.__R__.arrayBuffer()
}
}
const _fetch = function(url, options) { const _fetch = function(url, options) {
return new _Request(url, options, { return new _Request(url, options, {
BASE_URL: _fetch.BASE_URL, BASE_URL: _fetch.BASE_URL,

View File

@ -6,21 +6,29 @@
import { Format, toS } from './lib/format.js' import { Format, toS } from './lib/format.js'
const noop = function(e, res) { const NATIVE_FETCH = window.fetch
this.defer.resolve(res)
}
const NOBODY_METHODS = ['GET', 'HEAD'] const NOBODY_METHODS = ['GET', 'HEAD']
const FORM_TYPES = { const FORM_TYPES = {
form: 'application/x-www-form-urlencoded; charset=UTF-8', form: 'application/x-www-form-urlencoded; charset=UTF-8',
json: 'application/json; charset=UTF-8', json: 'application/json; charset=UTF-8',
text: 'text/plain; charset=UTF-8' text: 'text/plain; charset=UTF-8'
} }
const ERRORS = {
10001: 'Argument url is required',
10012: 'Parse error',
10100: 'Request canceled',
10104: 'Request pending...',
10200: 'Ok',
10204: 'No content',
10304: 'Not modified',
10500: 'Internal Server Error',
10504: 'Connected timeout'
}
class _Request { class _Request {
constructor(url = '', options = {}, { BASE_URL, __INIT__ }) { constructor(url = '', options = {}, { BASE_URL, __INIT__ }) {
if (!url) { if (!url) {
throw new Error('Argument url is required') throw new Error(ERRORS[10001])
} }
// url规范化 // url规范化
@ -176,8 +184,7 @@ class _Request {
delete options[k] delete options[k]
} }
} }
return window return NATIVE_FETCH(url, options)
.fetch(url, options)
.then(r => { .then(r => {
clearTimeout(this.timer) clearTimeout(this.timer)
var isSucc = r.status >= 200 && r.status < 400 var isSucc = r.status >= 200 && r.status < 400