
1 jatai 2021 年 3 月 1 日 via Android ..... promise, setTimeout resolve |
2 leopod1995 2021 年 3 月 1 日 ```js (()=>{ setTimeout(()=> { return 1; }, 1000 *3) })() ``` |
3 irytu 2021 年 3 月 1 日 via iPhone 至少 setTimeout 应该想出来 |
4 pkupyx 2021 年 3 月 1 日 想起来个题还稍微复杂点: testFunc() { console.log("要求这句话立即输出",new Date()); setTimeout(()=>{console.log("要求这句话 3 秒后输出",new Date());},1); // todo:要求不改动上面代码,这行后面写一段代码完成上面的需求。 } |
5 autoxbc 2021 年 3 月 1 日 @pkupyx #4 微任务阻塞宏任务? // todo const start =new Date(); queueMicrotask( function callee(){ if( new Date() - start < 3000 ) queueMicrotask(callee); }); |
7 Kasumi20 2021 年 3 月 1 日 等待 3 秒后返回 1,一定是异步的,要么返回 Promise 要么延迟传递消息 不可能同步地卡线程 3 秒 接下来给出一个帅气的答案: async function sleepSync(n) { return new Promise(resolve => setTimeout(() => resolve(), n)); } async function task() { await sleepSync(3000); return 1; } |
8 ericls 2021 年 3 月 1 日 这个需要写一个函数把主线程 block 3 秒,可能可以使用一些数学运算和循环之类的 否则在 Javascript 里面,很难 block 主线程 |
9 ericls 2021 年 3 月 1 日 |
10 Biwood 2021 年 3 月 1 日 @Kasumi20 #7 我点了感谢,不过仔细想想好像也不符合题目描述,要求“返回 1”,严格来讲 async 函数返回的是 Promise 对象,而不是 1 。楼上说用 setTimeout 好像也不对,因为计时器的回调函数的返回值不是外层函数的返回值。这样看能只能用阻塞主线程,用 Date.now()计数 3 秒再返回。 |
11 Biwood 2021 年 3 月 1 日 function foo() { const start = Date.now(); while (Date.now() - start < 3000) {} return 1; } |
12 Kasumi20 2021 年 3 月 1 日 @ericls 敢在项目里动这种念头,你怕不是要被打屎 |
14 Kasumi20 2021 年 3 月 2 日 @murmur #4 这个可以根据变量提升原则来实现: console.log("要求这句话立即输出",new Date()); setTimeout(()=>{console.log("要求这句话 3 秒后输出",new Date());},1); // todo:要求不改动上面代码,这行后面写一段代码完成上面的需求。 function setTimeout(func) { globalThis.setTimeout(func, 3000); } |
15 1sm23 OP @leopod1995 #2 你这个一执行就返回 undefined 啦 |
16 KMpAn8Obw1QhPoEP 2021 年 3 月 2 日 via Android @autoxbc 感觉这个靠谱 |
17 gBurnX 2021 年 3 月 2 日 最科学的方法 ,应该是把函数调用,改为框架调用。这样你就可以在框架里,利用各种 promise 、setTimeout 了。甚至还可以加入查询进度的功能。 简单来说,把 A 调用函数 B,改为 A 调用框架 B 。并且把调用过程,改为 2 个过程: 1.A 调用框架 B,并且发送参数、处理函数与回调函数。 2.框架 B 开始执行处理函数,执行完毕后,开发可以利用任何方法,延迟 3 秒。 3.延迟 3 秒后,框架 B 执行回调函数来通知 A 。 4.在 2 与 3 之间,甚至 A 还可以调用框架 B,来查询处理进度。 |
18 akatquas 2021 年 3 月 2 日 @leopod1995 你这返回值,被谁接住了? 谁能拿到这个返回的 1 ? |
19 cenbiq 2021 年 3 月 2 日 fun block(){ var startAt = Date.now( while(true) { if (Date.now() - startAt >= 3000) { return 1; } } } |
22 cczeng 2021 年 3 月 2 日 睡眠排序的兄弟? |
23 rodrick 2021 年 3 月 2 日 昨天问了我怎么在代码里区分是 http1 还是 2,回来查了一下就找到一个 window.chrome.loadTimes().connectionInfo |
24 togou 2021 年 3 月 2 日 return new Promise(r=>setTimeout(r(1),3000)); |
25 zhuweiyou 2021 年 3 月 2 日 await new Promise(resolve => setTimeout(resolve, 3000)) |
27 q673115816 2021 年 3 月 2 日 await new Promise(resolve => setTimeout(resolve, 3000, 1)) |
28 pkupyx 2021 年 3 月 2 日 卡死当前线程的都 OK,答案自己跑一下就试出来能不能过了,主要考察对 JS 线程与任务调度的理解。 |
29 xutao881 2021 年 3 月 2 日 。。。这个需求用来骗甲方好给自己留有优化的余地么?直接阻塞线程可还行 |
30 shilyx 2021 年 3 月 2 日 其实这个题在问: "既然你说你懂 JS,那么能否用 JS 证明你不懂 JS ?“ |
31 cxe2v 2021 年 3 月 2 日 |
34 autoxbc 2021 年 3 月 2 日 via iPhone @cxe2v 那你再仔细检查一下吧,我在 firefox,vivaldi,node,deno 各跑了一次。另外为了排版,缩进那里有全角空格,要手工去掉 |
35 libook 2021 年 3 月 2 日 理论上来说,3 秒后返回 1,应该是需要阻塞线程的,否则只能立即返回 promise,然后 3 秒后接收到值。 |
36 lwlizhe 2021 年 3 月 2 日 好像 java 的类加载机制这块范例中有这种类似的,可惜这里是 js…… |
37 djs 2021 年 3 月 2 日 var fun = () => { var star = new Date().getTime(); let t = new Date().getTime(); while (t - star < 3000) { t = new Date().getTime(); } return 1; }; |
39 rrfeng 2021 年 3 月 2 日 谁给我解释一下,这不就是个 sleep(3s) 的问题吗?还是我理解错了? js 里没法实现 sleep 吗? |
40 autoxbc 2021 年 3 月 2 日 @rrfeng #39 js 可以 sleep,不过要用异步实现。异步的话原函数就需要先返回 promise,等 sleep 结束 resolve 出原始返回值 而这里题目不允许修改函数返回值,也就不能异步,必须同步实现,只能用死循环阻塞住同步任务 本质上不是问生产代码怎么写,而是加个不必要的预设,逼你用些奇技淫巧,目的是考察对任务调度的理解 |
42 dd112389 2021 年 3 月 3 日 这个只能阻塞主线程来做吧, 异步基本都是在局部域里面, 拿不到返回值的. 之前看过腾讯云的 cos sdk, 忘了是 v 几, 就是阻塞主线程等待对象初始化完毕. 现在好像都改异步了. |
43 fy136649111 2021 年 3 月 3 日 还可以这样 function sleep(){ Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 3000); } |
44 fy136649111 2021 年 3 月 3 日 @fy136649111 function sleep(){ Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 3000); return 1; } |