// 一些功能的检测
var support = {
searchParams: 'URLSearchParams' in self, //queryString处理函数
iterable: 'Symbol' in self && 'iterator' in Symbol,
blob:
'FileReader' in self &&
'Blob' in self &&
(function() {
try {
new Blob()
return true
} catch (e) {
return false
}
})(),
formData: 'FormData' in self,
arrayBuffer: 'ArrayBuffer' in self //二进制存储
}
function isDataView(obj) {
return obj && DataView.prototype.isPrototypeOf(obj)
}
// 支持的 ArrayBuffer类型
if (support.arrayBuffer) {
var viewClasses = [
'[object Int8Array]',
'[object Uint8Array]',
'[object Uint8ClampedArray]',
'[object Int16Array]',
'[object Uint16Array]',
'[object Int32Array]',
'[object Uint32Array]',
'[object Float32Array]',
'[object Float64Array]'
]
// 检查是不是DataView,DataView是来读写ArrayBuffer的。
var isArrayBufferView =
ArrayBuffer.isView ||
function(obj) {
return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1
}
}
// 检查header name,并转为小写。
function normalizeName(name) {
// 不是字符串,转为字符串
if (typeof name !== 'string') {
name = String(name)
}
// 不是以a-z 0-9 等开头的抛出错误。
if (/[^a-z0-9\-#$%&'*+.^_`|~]/i.test(name) || name === '') {
throw new TypeError('Invalid character in header field name')
}
// 转为小写。
return name.toLowerCase()
}
// 转换header的值。
function normalizeValue(value) {
if (typeof value !== 'string') {
value = String(value)
}
return value
}
// Build a destructive iterator for the value list
// 枚举器
function iteratorFor(items) {
var iterator = {
next: function() {
var value = items.shift()
return {done: value === undefined, value: value}
}
}
if (support.iterable) {
iterator[Symbol.iterator] = function() {
return iterator
}
}
return iterator
}
// 封装的Headers。
export function Headers(headers) {
// headers最终存储的地方。
this.map = {}
if (headers instanceof Headers) {
// 如果已经是Headers的实例,复制键值。
headers.forEach(function(value, name) {
this.append(name, value)
}, this)
} else if (Array.isArray(headers)) {
headers.forEach(function(header) {
this.append(header[0], header[1])
}, this) // this修改forEach执行函数上下文为当前上下文,就可以直接调用append方法了。
} else if (headers) {
Object.getOwnPropertyNames(headers).forEach(function(name) {
this.append(name, headers[name])
}, this)
}
}
// 添加或追加Header。
Headers.prototype.append = function(name, value) {
name = normalizeName(name)
value = normalizeValue(value)
var oldValue = this.map[name]
this.map[name] = oldValue ? oldValue + ', ' + value : value
}
// 删除名为name的Header。
Head
fetch源码分析学习笔记
最新推荐文章于 2023-05-04 18:39:23 发布