2024年Web前端最新(立下flag)每日10道前端面试题-17 关于【Promise】十问(2),2024年最新面试心得体会

常用的JavaScript设计模式

  • 单体模式

  • 工厂模式

  • 例模式

函数

对finally方法的理解:(1)p.resolve(callback())这句函数callback已经执行 (2)finally方法return的是一个promise对象,所以还可以继续链式调用其他方法 (3)对于Promise.resolve方法

Promise.resolve(‘foo’);

等价于

new Promise(resolve => resolve(‘foo’));

所以可以通过then方法的回调函数 接受 实例对象返回的参数 比如:

Promise.resolve(function(){console.log(2);}).then(function(cb){cb()})

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


function red() {

console.log(‘red’);

}

function green() {

console.log(‘green’);

}

function yellow() {

console.log(‘yellow’);

}

解析红灯3秒亮一次,绿灯1秒亮一次 ,黄灯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

答案

// 保存数组中的函数执行后的结果

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;

第十一问:封装一个异步加载图片的方法


function loadImageAsync(url) {

return new Promise(function(resolve,reject) {

学习分享,共勉

题外话,毕竟我工作多年,深知技术改革和创新的方向,Flutter作为跨平台开发技术、Flutter以其美观、快速、高效、开放等优势迅速俘获人心

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

第十一问:封装一个异步加载图片的方法


function loadImageAsync(url) {

return new Promise(function(resolve,reject) {

学习分享,共勉

题外话,毕竟我工作多年,深知技术改革和创新的方向,Flutter作为跨平台开发技术、Flutter以其美观、快速、高效、开放等优势迅速俘获人心

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

[外链图片转存中…(img-2zBL0cjN-1715471803946)]

  • 27
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值