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