LinDaiDai/niubility-coding-js

对于45题面试题的一些自己的想法

Opened this issue · 0 comments

指路:https://github.com/LinDaiDai/niubility-coding-js/blob/master/JavaScript/%E5%BC%82%E6%AD%A5/%E8%A6%81%E5%B0%B1%E6%9D%A545%E9%81%93Promise%E9%9D%A2%E8%AF%95%E9%A2%98%E4%B8%80%E6%AC%A1%E7%88%BD%E5%88%B0%E5%BA%95.md
hi你好呀谢谢你整理的题目~今天我把45题都做了一遍,然后发现一些不一样的地方,经我的查阅以及确认后,想来与你分享,所以提了个issue。我可能也不一定是对的,你可以和我一起讨论下。
**1.4:**这里我的答案是'promise1'
'1' Promise{: 'resolve1'}
'2' Promise{: undefined}
'resolve1'
其中promise2 不应该为pending态(浏览器确实是输出这个,但是那个对象展开后其实是fulfilled)
image
then()内resolve回调在没有返回值时默认返回一个新的fulfilled态的Promise,这是链式调用的根本。
2.3这里无关答案就是突然发现有两个2.3的序号哈哈哈
3.10.finally()方法不管Promise对象最后的状态如何都会执行 这里应该严谨些 pengding状态是不会执行finally的
4.1 r(x, console.log(x)这个写法 虽然确实是运行了 console.log 我也查阅了资料,想查出resolve函数是否能接受多个参数,但没有查到具体文档,但是我试过resolve(1,console.log(1),console.log(2),console.log(3),console.log(4))后面的参数无论多少都可以被执行,
image
以上图片是ecma文档的描述 所以我认为 这样书写并不规范,容易造成误解。感觉这样写更好些:
const p = new Promise(r => setTimeout(() => {r(x); console.log(x)}, 1000)) 后面还有一些例题也是这样子的
5.1// 转换后代码
new Promise(resolve => {
console.log("async2")
resolve()
}).then(res => console.log("async1 end"))
这里有误, 现在await的语义应该是 Promise.resolve() 具体可以看https://www.zhihu.com/question/268007969中的解释
这里涉及一个优化 ,Promise.resolve(p),这个p若是一个Promise 则会原封不动返回这个p,但若是new Promise()则会创建一个新的Promise
**5.5和5.6 5.7....**的代码中script写误了,r和c写反了,问题不大 (全局搜索一下好了 后来我发现好像代码里的很多处script都写错了就不列举了)
5.8 (这道题最后async1 end和promise2的顺序其实在网上饱受争议,我这里使用浏览器Chrome V80,Node v12.16.1的执行结果都是上面这个答案). 这个差异的原因其实就是我前面提到的那个 await 的语义的问题 https://www.zhihu.com/question/268007969 不同版本输出不同 是因为tc39更改await的语义标准导致的 其实最开始就是跟现在一样的 ,但中间tc39改了一个版本 最后又在某次改回来了(也就是现在这个标准)是出于性能的原因又优化回来了吧,现在的版本 await 只需要一次microtick 而之前的版本至少需要三个microtick 可以刚才这个链接中的
image
这个老男孩的回答。

5.9 里面的something 都少了字母h
7.3 resolve('resovle1'); 的resolve 写错了 v 和l写反 但是答案中没写错
8.5 8.6 最后末尾少了一个大括号}