拼多多暑期前端实习三面
拼多多暑期前端实习三面
-
有可能前两轮面试问的太猛了,第三轮面试比较轻松,大部分时间都在聊学习前端的经历,校园经历和项目经历,还问了问怎么带学弟学妹学前端,哈哈哈哈哈
-
最后做了一道题
-
/** * * @param time 延迟改变promise状态的时间,模拟网络请求 * @returns {Promise<unknown>} */ function getPromise(time) { return new Promise((resolve, reject) => { setTimeout(Math.random() > 0.5 ? resolve : reject, time, time); }); } /** * * @param urls urls数组,这里传入的是一个时间数组,通过getPromise函数模拟网络请求 */ function request(urls) { // 用于收集promise结果的数组 let arr = new Array(urls.length).fill(-1), end = 0; for (let i = 0; i < urls.length; i++) { getPromise(urls[i]) .then((res) => { // 收集promise结果 arr[i] = res; }) .catch((err) => { arr[i] = err; }) .finally(() => { // 查找结果数组中第一项为-1的元素下标,表示第一个没有结果的promise实例在数组中对应的下标, // 从0到该下标遍历结果数组,判断遍历过的每一个下标所对应的promise实例是否有结果 // 如果元素值是-1,表示当前下标对应的promise实例还没有结果 // 如果元素值是undefined,说明该下标对应的promise实例结果已经被输出 end = arr.findIndex((item) => item === -1); // 如果结果数组中没有值为-1的元素,说明整个promise数组中的promise实例都有了结果 // 需要从头到尾依次遍历输出 end = end === -1 ? urls.length : end; for (let j = 0; j < end; j++) { // 打印已经有结果的promise实例的值,并且该值还未被输出过 if (arr[j] !== void 0 && arr[j] !== -1) { console.log(j, arr[j]); // 打印后将该下标对应的promise结果标记为undefined,表示已经输出 arr[j] = void 0; } // 如果当前下标对应的值为-1,表示当前下标对应的promise实例还没有结果, // 需要跳出循环,等待下一轮执行 if (arr[j] === -1) break; } }); } } let urls = [2000, 1000, 5000, 4000]; let urls2 = [1000, 2000, 3000, 4000]; let urls3 = [4000, 3000, 2000, 1000, 2000, 1000, 5000, 4000, 1000, 0]; /* 实现一个能够尽可能快的串行执行promise的函数 实现一个request函数,按照数组顺序打印promise结果,包括成功和失败的情况 promise一有结果立即输出,不能等到所有promise实例都有结果后,一次性输出 比如输出参数为urls3的时候 经过4s,打印,4000 3000 2000 1000 2000 1000 再经过1s后,打印 5000 4000 1000 0 */ request(urls3);