今天参加了一场面试,笔试题没有过.... 个人感觉第三题和第四题答的不好,排坑~
m1.jpeg
m2.jpeg
m3.jpeg
m4.jpeg
const user = [{
id: 1,
name: 'a'
}, {
id: 2,
name: 'a'
}, {
id: 3,
name: 'b'
}, {
id: 4,
name: 'b'
}]
function uniqueName(arr) {
let newArr = []
if (Object.prototype.toString.call(arr).indexOf('Array') > 0) {
arr.forEach((item, index) => {
if (item.name) {
newArr.push(item.name)
}
});
} else {
return {
message: '请传入数组对象'
}
}
return Array.from(new Set(newArr))
}
uniqueName(user)
// 还存在一个疑问,这题考的是自己设置超时时间么?
let newFetch = (url) => {
// 重传次数控制
let requestAgain = 0
// 创建控制器对象
const controller = new AbortController()
// AbortController.signal属性获取其关联 AbortSignal对象的引用
const signal = controller.signal
//判断是否为IE 该判断不支持IE11 以上
if (navigator.userAgent.indexOf('MSIE') > -1) {
// 如果是ie 不支持-- AbortController--
// 也不支持fetch
// 此时使用原生xmlHttpRequest
// ie5/6和ie6+创建xmlHttpRequest对象有所不同
return new Promise((resolve, reject) => {
xmlreq(url, 'GET', resolve)
}).then((res) => {
// console.log('success')
// console.log(res)
}).catch(err => {
// 重新发送请求一次
if (requestAgain != 0) return
requestAgain++
xmlreq(url, 'GET', resolve)
})
} else {
// 不是ie
return Promise.race([requestPromise(url, signal).then(async (res) => {
let result = await res.json()
// console.log(result)
}).catch((err) => {
// 错误时重发
// 使用控制器终止请求
controller.abort()
// 重新发送请求
requestPromise(url).then(async (res) => {
let result = await res.json()
// console.log('请求重发')
// console.log(result)
})
}), new Promise((resolve, reject) => {
setTimeout(() => {
// 使用控制器终止请求
controller.abort()
// 重新发送请求一次
if (requestAgain != 0) return
requestAgain++
requestPromise(url).then(async (res) => {
let result = await res.json()
// console.log('请求重发')
// console.log(result)
})
}, 30000);
})])
}
}
// 封装fetch 请求
let requestPromise = (url, signal = {}) => {
return fetch(url, {
signal,
headers: {
"Content-Type": 'application/json;charset=utf-8;'
}
})
}
// 封装xmlHTTPRequest
let xmlreq = (url, methods = 'GET', resolve) => {
// 创建xmlHttpRequest 对象
let xmlHttpReq
if (window.XMLHttpRequest) {
// ie6+
xmlHttpReq = new XMLHttpRequest();
} else {
// ie5/6
xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP")
}
// 设置超时时间
xmlHttpReq.timeout = 30000
xmlHttpReq.open('GET', url)
xmlHttpReq.send()
xmlHttpReq.ontimeout = (event) => {
// 终止上一次请求
xmlHttpReq.abort()
// 重新发送请求
xmlHttpReq.send()
}
xmlHttpReq.onreadystatechange = function (event) {
if (event.target.readyState == 4 && event.target.status == 200) {
let resData = JSON.parse(xmlHttpReq.response)
resolve(resData)
}
}
}
newFetch('http://a.com')
网友评论