SilencerL

SilencerL

rm -rf MySelf
🏢  NetDragon Websoft Inc. / Senior Software Engineer
V2EX 第 369527 号会员,加入于 2018-12-11 09:54:33 +08:00
今日活跃度排名 17886
根据 SilencerL 的设置,主题列表只有在你登录之后才可查看
二手交易 相关的信息,包括已关闭的交易,不会被隐藏
SilencerL 最近回复了
41 天前
回复了 yeadream 创建的主题 程序员 完全用 ChatGPT 写一个 IOS 应用可行吗?
之前从 0 通过 ChatGPT 搞了个 macOS 的 App ,体验不能说好,但是的确是可以的;主要就是 GPT 给出的答案可能是错的,或者可能不是最新、最佳解决方案。

GPT 有时候会给错误的代码,但是看起来一本正经是对的,如果你发现了这个错误,那你告诉他,他会道歉并改正,但是改正的代码也不一定能用(
所以要复制代码、尝试运行代码、报错、再问 GPT ,如此往复
而且在一些细节问题上不要一直在一个会话里问,可以开新的会话,否则会受上下文影响导致错误更深
同时不要只靠 GPT ,偶尔还是要 Google 一下
Plus/Pro Max 拍照的问题,女孩子自拍应该没啥问题
主要我烦的是 Pro 是 3 倍,Pro Max 是 5 倍;所以 Pro Max 的 2-5 之间的变焦是一倍裁切的,超烂,而且拍视频的时候有时候切不到长焦镜头,会因为光线之类的问题还是 1 倍裁切。
75 天前
回复了 vah970 创建的主题 天黑以后 20231221 午夜俱乐部
btw 喹硫平还有个最大的副作用,食欲暴增。我前两天因为实在睡不着半夜爬起来吃了 1/4 颗喹硫平+第二颗右佐匹克隆,有点用。睡醒之后饿到能塞进去一头牛,点了双份 KFC 早餐套餐吃了个精光。
所以,大家一定要调整好自己的生物钟,我真是实名惨。
75 天前
回复了 vah970 创建的主题 天黑以后 20231221 午夜俱乐部
吃了安眠药还是睡不着,可能有耐药性了。一开始吃奥沙西泮+右佐匹克隆无效,后来换劳拉西泮+右佐匹克隆无效,中途去外地开了一次氯硝西泮+思诺思,感觉可能有效但是也不大。回来之后本地专科医院没有思诺思,换成了阿普唑仑+右佐匹克隆。一开始一个多星期都挺好,前两天突然开始半夜早醒,这两天就开始完全无效了。睁眼躺了三个多小时了。。。
中途还吃过喹硫平,这玩意只会让我身体很累眼皮子打架,但是脑子还是很清醒,而且副作用呼吸困难,更痛苦。
挂了周五的老专家号,希望能送我个好觉。
晚安大家。
所以 https://vscode.dev/ 才能实现功能
买了,但是我自己背它出去大概率不好看,所以准备挂在墙上当装饰品,肯定很好看
85 天前
回复了 whoami9426 创建的主题 React 刚学习 React 请教一个 useState 有关的问题
简化一下你的代码:

Promise.resolve()
.then(() => {
setTimeout(() => console.info(1))
})
.then(() => {
Promise.resolve()
.then(() => {
setTimeout(() => console.info(2))
})
.then(() => {
setTimeout(() => console.info(5))
})
.then(() => {
setTimeout(() => console.info(6))
});
})
.then(() => {
setTimeout(() => {
console.info(3)
Promise.resolve().then(() => console.info(4))
})
})

进一步简化:

Promise.resolve()
.then(() => {
console.info(1)
})
.then(() => {
Promise.resolve()
.then(() => {
console.info(2)
})
.then(() => {
console.info(5)
})
.then(() => {
console.info(6)
});
})
.then(() => {
console.info(3)
// console.info(4) // 1 2 3 4 5 6
// Promise.resolve().then(() => console.info(4)) // 1 2 3 5 4 6
// setTimeout(()=>console.info(4)) // 1 2 3 5 6 4
})

你这个问题可以简化成和 React 没任何关系的问题,纯粹是浏览器任务队列的问题,Promise.resolve().then 可以生成一个微任务,setTimeout 或者你问题中的 setArr 生成的时宏任务(现代浏览器没得宏任务了,分成了更多任务列表,但是为了方便解释就还是说宏任务)

你可以观察进一步简化后的版本,以及看一下最后一个 then 里面关于不同方式 4 的输出时机,尝试理解一下。

但是不得不说,理解起来可能很困难,你需要了解 js 的事件循环以及队列优先级的问题。

大概来说,微任务优先级高,宏任务优先级低,每次事件循环按照优先级拿一遍任务。

- 最顶层的 Promise.resolve().then -> console.info(1) 立刻输出 1

- 第二个 then
-- 第二个 then 里面 Promise.resolve().then -> console.info(2) 立刻输出 2
-- 第二个 then 里面 Promise.resolve() 的第一个 then 作为一个微任务已经结束,后续的第二个 then 扔到下一次微任务队列中

- 第三个 then
-- 第一句 console.info(3) 立刻输出 3
-- 第二句:
--- 情况 1:console.info(4) 那就立刻输出 4
--- 情况 2:Promise.resolve().then(() => console.info(4)) 扔一个微任务到下次事件队列,任务是 console.info(4)
--- 情况 3:setTimeout(()=>console.info(4)) 扔一个宏任务到下次事件队列,任务是 console.info(4)

- 下一次循环
-- 微任务队列有一个
.then(() => {
console.info(5)
})
.then(() => {
console.info(6)
});
--- 这里你可以看成一个新的
Promise.resolve()
.then(()=> console.info(5))
.then(() => {
console.info(6)
});
(当然这不能真的这么看,但是为了讲解方便,你就这么理解好了。。。)
--- 所以立即执行了这个微任务 console.info(5),把 console.info(6) 继续扔到微任务队列
-- 如果上一次循环的第三个 then 里面情况 2 ,那么在上一步的 5 输出结束后 6 的前面就有一个上一次扔过来的的微任务:console.info(4)
-- 如果上一次是情况 3 ,输出 4 这个任务在宏任务队列,那么就先不管他,把当前下一个微任务输出 6 执行,再去执行宏任务队列 console.info(4)

单纯文字讲的讲不清楚,你要实际用代码多试几次,尽可能简化代码并且尝试不同的 case ,才能大概理解这个幺蛾子事件队列

顺便感谢你提供一道好玩的面试题,下次可以拿去为难其他人(
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5115 人在线   最高记录 6543   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 11ms · UTC 09:42 · PVG 17:42 · LAX 01:42 · JFK 04:42
Developed with CodeLauncher
♥ Do have faith in what you're doing.