美文网首页
2020-10-25前端面试笔试题

2020-10-25前端面试笔试题

作者: 昊哇恰 | 来源:发表于2020-10-25 22:20 被阅读0次

今天参加了一场面试,笔试题没有过.... 个人感觉第三题和第四题答的不好,排坑~

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')
  • 有写错的地方还请各路大神多多指点~

相关文章

网友评论

      本文标题:2020-10-25前端面试笔试题

      本文链接:https://www.haomeiwen.com/subject/tccomktx.html