2024年最全关于 ES6 中 Promise 的面试题_es6 promise面试题,网络工程师面试题

前端面试题汇总

JavaScript

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

性能

linux

前端资料汇总

then: success1


#### 题目三



Promise.resolve(1)
.then(2)
.then(Promise.resolve(3))
.then(console.log)


#### 解析


`Promise.resolve` 方法的参数如果是一个原始值,或者是一个不具有 `then` 方法的对象,则 `Promise.resolve` 方法返回一个新的 `Promise` 对象,状态为`resolved`,`Promise.resolve` 方法的参数,会同时传给回调函数。


`then` 方法接受的参数是函数,而如果传递的并非是一个函数,它实际上会将其解释为 `then(null)`,这就会导致前一个 `Promise` 的结果会穿透下面。


#### 答案



1


#### 题目四


红灯三秒亮一次,绿灯一秒亮一次,黄灯2秒亮一次;如何让三个灯不断交替重复亮灯?(用Promse实现)三个亮灯函数已经存在:



function red() {
console.log(‘red’);
}
function green() {
console.log(‘green’);
}
function yellow() {
console.log(‘yellow’);
}


#### 解析


红灯三秒亮一次,绿灯一秒亮一次,黄灯2秒亮一次,意思就是3秒,执行一次 red 函数,2秒执行一次 green 函数,1秒执行一次 yellow 函数,不断交替重复亮灯,意思就是按照这个顺序一直执行这3个函数,这步可以就利用递归来实现。


#### 答案



function red() {
console.log(‘red’);
}
function green() {
console.log(‘green’);
}
function yellow() {
console.log(‘yellow’);
}

var light = function (timmer, cb) {
return new Promise(function (resolve, reject) {
setTimeout(function () {
cb();
resolve();
}, timmer);
});
};

var step = function () {
Promise.resolve().then(function () {
return light(3000, red);
}).then(function () {
return light(2000, green);
}).then(function () {
return light(1000, yellow);
}).then(function () {
step();
});
}

step();


#### 题目五


实现 mergePromise 函数,把传进去的数组按顺序先后执行,并且把返回的数据先后放到数组 data 中。



const timeout = ms => new Promise((resolve, reject) => {
setTimeout(() => {
resolve();
}, ms);
});

const ajax1 = () => timeout(2000).then(() => {
console.log(‘1’);
return 1;
});

const ajax2 = () => timeout(1000).then(() => {
console.log(‘2’);
return 2;
});

const ajax3 = () => timeout(2000).then(() => {
console.log(‘3’);
return 3;
});

const mergePromise = ajaxArray => {
// 在这里实现你的代码

};

mergePromise([ajax1, ajax2, ajax3]).then(data => {
console.log(‘done’);
console.log(data); // data 为 [1, 2, 3]
});

// 要求分别输出
// 1
// 2
// 3
// done
// [1, 2, 3]


#### 解析


首先 `ajax1 、ajax2、ajax3` 都是函数,只是这些函数执行后会返回一个 `Promise`,按题目的要求我们只要顺序执行这三个函数就好了,然后把结果放到 `data` 中,但是这些函数里都是异步操作,想要按顺序执行,然后输出 1,2,3并没有那么简单,看个例子。



function A() {
setTimeout(function () {
console.log(‘a’);
}, 3000);
}

function B() {
setTimeout(function () {
console.log(‘b’);
}, 1000);
}

A();
B();

// b
// a


例子中我们是按顺序执行的 `A`,`B` 但是输出的结果却是 `b`,`a` 对于这些异步函数来说,并不会按顺序执行完一个,再执行后一个。  
 这道题就是考用 `Promise` 控制异步流程,我们要想办法,让这些函数,一个执行完之后,再执行下一个,看答案吧。


#### 答案



// 保存数组中的函数执行后的结果
var data = [];

// Promise.resolve方法调用时不带参数,直接返回一个resolved状态的 Promise 对象。
var sequence = Promise.resolve();

ajaxArray.forEach(function (item) {
// 第一次的 then 方法用来执行数组中的每个函数,
// 第二次的 then 方法接受数组中的函数执行后返回的结果,
// 并把结果添加到 data 中,然后把 data 返回。
// 这里对 sequence 的重新赋值,其实是相当于延长了 Promise 链
sequence = sequence.then(item).then(function (res) {
data.push(res);
return data;
});
})

// 遍历结束后,返回一个 Promise,也就是 sequence, 他的 [[PromiseValue]] 值就是 data,
// 而 data(保存数组中的函数执行后的结果) 也会作为参数,传入下次调用的 then 方法中。
return sequence;


#### 题目六


以下代码最后输出什么?



const first = () => (new Promise((resolve, reject) => {
console.log(3);
let p = new Promise((resolve, reject) => {
console.log(7);
setTimeout(() => {
console.log(5);
resolve(6);
}, 0)
resolve(1);
});
resolve(2);
p.then((arg) => {
console.log(arg);
});

}));

first().then((arg) => {
console.log(arg);
});
console.log(4);


#### 解析


这道题就其实和 `Promise` 的关系不太大,主要是需要理解 JS执行机制,才能很好的解决这道题,对于 JS 执行机制不了解的朋友推荐看看这篇文章


[这一次,彻底弄懂 JavaScript 执行机制](https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0)


##### 第一轮事件循环


先执行宏任务,主script ,new Promise立即执行,输出【3】,  
 执行 p 这个new Promise 操作,输出【7】,  
 发现 setTimeout,将回调放入下一轮任务队列(Event Queue),p 的 then,姑且叫做 then1,放入微任务队列,发现 first 的 then,叫 then2,放入微任务队列。执行`console.log(4)`,输出【4】,宏任务执行结束。  
 再执行微任务,执行 then1,输出【1】,  
 执行 then2,输出【2】。  
 到此为止,第一轮事件循环结束。开始执行第二轮。


##### 第二轮事件循环


先执行宏任务里面的,也就是 setTimeout 的回调,输出【5】。  
 `resolve(6)` 不会生效,因为 p 这个 Promise 的状态一旦改变就不会在改变了。


#### 答案



3
7
4
1
2
5


#### 题目七


有 8 个图片资源的 url,已经存储在数组 `urls` 中(即`urls = ['http://example.com/1.jpg', ...., 'http://example.com/8.jpg'])`,而且已经有一个函数 `function loadImg`,输入一个 url 链接,返回一个 Promise,该 Promise 在图片下载完成的时候 resolve,下载失败则 reject。  
 但是我们要求,任意时刻,同时下载的链接数量不可以超过 3 个。  
 请写一段代码实现这个需求,要求尽可能快速地将所有图片下载完成。



var urls = [‘https://www.kkkk1000.com/images/getImgData/getImgDatadata.jpg’, ‘https://www.kkkk1000.com/images/getImgData/gray.gif’, ‘https://www.kkkk1000.com/images/getImgData/Particle.gif’, ‘https://www.kkkk1000.com/images/getImgData/arithmetic.png’, ‘https://www.kkkk1000.com/images/getImgData/arithmetic2.gif’, ‘https://www.kkkk1000.com/images/getImgData/getImgDataError.jpg’, ‘https://www.kkkk1000.com/images/getImgData/arithmetic.gif’, ‘https://www.kkkk1000.com/images/wxQrCode2.png’];
function loadImg(url) {
return new Promise((resolve, reject) => {
const img = new Image()
img.onload = function () {
console.log(‘一张图片加载完成’);
resolve();
}
img.onerror = reject
img.src = url
})
};


#### 解析


### React

*   介绍一下react

*   React单项数据流

*   react生命周期函数和react组件的生命周期

*   react和Vue的原理,区别,亮点,作用

*   reactJs的组件交流

*   有了解过react的虚拟DOM吗,虚拟DOM是怎么对比的呢

*   项目里用到了react,为什么要选择react,react有哪些好处

*   怎么获取真正的dom

*   选择react的原因

*   react的生命周期函数

*   setState之后的流程

*   react高阶组件知道吗?

*   React的jsx,函数式编程

*   react的组件是通过什么去判断是否刷新的

*   如何配置React-Router

*   路由的动态加载模块

*   Redux中间件是什么东西,接受几个参数

*   redux请求中间件如何处理并发

**[开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】](https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0)**

![](https://img-blog.csdnimg.cn/img_convert/9749ea39072fc4b7b27af6f3a4db5ab1.png)

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值