说说自己曾经遇到的那些个面试题

103 阅读2分钟

代码填空,并完成指定功能。

function sleep(time){
    // 请写出你的代码
}

sleep(2000).then(()=>{
    console.log("后续操作")
})
console.log(2);

目标 是让sleep 的功能与setTimeout一样:就是等2000毫秒之后再执行后续操作。

思路分析

  1. 首先.then要执行,sleep必须是一个promise对象
  2. 什么时候执行,2000毫秒后,那么第一反应是使用定时器,结束后返回某个值,让下面那行代码执行
  3. 最后执行代码
function sleep(time){
      // 1、声明一个变量,用于储存promise对象
	let p =  new Promise(function(resolve,reject){
      // 2、异步操作,根据执行结果,决定是否调用 resolve,reject
        setTimeout(function(){
      // 3、调用 resolve
            resolve()
        }, time)
    })
      //最后返回这个promise对象
      return p
}
sleep(2000).then(()=>{
    console.log("后续操作")
})

其实代码的难度并不难,最关键的是这个return,一定要记住返回这个promise对象回去,如果不返回则会报错

无法读取未定义的属性(读取“then”)

image.png

传参

function increment(value) {
    return value + 1;
}
function doubleUp(value) {
    return value * 2;
}
function output(value) {
    console.log(value);// => (1 + 1) * 2
}
var p = Promise.resolve(1);
p.then(increment)
 .then(doubleUp)
 .then(output)

求打印的结果

思路分析

1、首先p的状态是resolved并传了一个参数1 2、在执行then的第一个参数时,将1传入

image.png

此时可以看到,我们已经将value改为1了,那么increment执行后的返回值就是2,p的状态是resolved等同于(fulfilled),promiseValue是2 ,所以还能继续执行.then

image.png

3、当执行doubleUp这个函数时,此时的value是2,p的状态是resolved,promiseValue的值为2,继续往下执行,如何查看p执行的状况,代码如下

image.png

检查后的结果为

image.png

image.png 此时可以很清晰的看到value的值为2,return返回的值是4

道理同上,最后执行的结果log打印为4