面试总结(二)

第 6 题:setTimeout、Promise、Async/Await 的区别

setTimeout里面的回调函数是异步函数,会放在宏任务队列里,等待下次宏任务执行时调取,Promise.then方法里面的回调函数会放在当前宏任务里的微任务队列中,当同步任务执行完毕后,会执行当微任务队列中的代码,Async和Await,Async函数表示函数里面可能有异步方法,await后面跟一个表达式,async方法执行时,遇到await会立即执行表达式,然后把表达式后面的代码放到微任务队列里面,让出执行栈后让同步代码后先执行。

第 11 题:(携程)算法手写题

已知如下数组:

var arr = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10];

编写一个程序将数组扁平化去并除其中重复部分数据,最终得到一个升序且不重复的数组

var arr = [[1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14]]]], 10];
// 方法一
console.log(Array.from(new Set(arr.flat(Infinity))).sort((a, b) => a - b))
// 方法二
console.log(Array.from(new Set(arr.toString().split(','))).map(Number).sort((a, b) => a - b))

// 方法三
// 第一步:扁平化
let newArr = [];
function flat(originArr) {
    if ({}.toString.call(originArr) === '[object Array]') {
        for (let i of originArr) {
            if ({}.toString.call(i) === '[object Array]') {
                arguments.callee(i)
            } else {
                newArr.push(i)
            }
        }
    }
    return newArr;
}
console.log(flat(arr))
// 第二步:去重
var newArr1 = [];
for (let i of newArr) {
    if (!newArr1.includes(i)) newArr1.push(i);
}
// 第三步:排序 可以采用相关算法处理
console.log(newArr1.sort((a, b) => a - b))

说说异步处理函数

Promise

Promise就是为了解决callback的问题而产生的。

Promise 实现了链式调用,也就是说每次 then 后返回的都是一个全新 Promise,如果我们在 then 中 return ,return 的结果会被Promise.resolve() 包装

优点:解决了回调地狱的问题

ajax('XXX1')
    .then(res => {
        // 操作逻辑
        return ajax('XXX2')
    }).then(res => {
        // 操作逻辑
        return ajax('XXX3')
    }).then(res => {
        // 操作逻辑
    })

缺点:无法取消 Promise ,错误需要通过回调函数来捕获

Generator

特点:可以控制函数的执行,可以配合 co 函数库使用

function* fetch() {
    yield ajax('XXX1', () => { })
    yield ajax('XXX2', () => { })
    yield ajax('XXX3', () => { })
}
let it = fetch()
let result1 = it.next()
let result2 = it.next()
let result3 = it.next()
Async / await

async、await 是异步的终极解决方案

优点是:代码清晰,不用像 Promise 写一大堆 then 链,处理了回调地狱的问题

缺点:await 将异步代码改造成同步代码,如果多个异步操作没有依赖性而使用 await 会导致性能上的降低。

async function test() {
        // 以下代码没有依赖性的话,完全可以使用 Promise.all 的方式
        // 如果有依赖性的话,其实就是解决回调地狱的例子了
        await fetch('XXX1')
        await fetch('XXX2')
        await fetch('XXX3')
    }
async function test() {
        // 以下代码没有依赖性的话,完全可以使用 Promise.all 的方式
        // 如果有依赖性的话,其实就是解决回调地狱的例子了
        await fetch('XXX1')
        await fetch('XXX2')
        await fetch('XXX3')
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值