跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 看到一个面试题
未分類
17 2 月 2021

看到一个面试题

看到一个面试题

資深大佬 : 1sm23 7

函数在执行之后等待 3 秒返回 1,感觉是一个 js 事件的问题,想不出来
大佬有話說 (44)

  • 資深大佬 : jatai

    ….. promise, setTimeout resolve

  • 資深大佬 : leopod1995

    “`js
    (()=>{
    setTimeout(()=> {
    return 1;
    }, 1000 *3)
    })()

    “`

  • 資深大佬 : irytu

    至少 setTimeout 应该想出来

  • 資深大佬 : pkupyx

    想起来个题还稍微复杂点:

    testFunc() {
    console.log(“要求这句话立即输出”,new Date());
    setTimeout(()=>{console.log(“要求这句话 3 秒后输出”,new Date());},1);
    // todo:要求不改动上面代码,这行后面写一段代码完成上面的需求。

    }

  • 資深大佬 : autoxbc

    @pkupyx #4 微任务阻塞宏任务?
    // todo
    const start = new Date();
    queueMicrotask( function callee(){
      if( new Date() – start < 3000 )
       queueMicrotask(callee);
    });

  • 資深大佬 : murmur

    @pkupyx 修改 console.log 的函数算么

  • 資深大佬 : Kasumi20

    等待 3 秒后返回 1,一定是异步的,要么返回 Promise 要么延迟传递消息

    不可能同步地卡线程 3 秒

    接下来给出一个帅气的答案:
    async function sleepSync(n) { return new Promise(resolve => setTimeout(() => resolve(), n)); }

    async function task() {
    await sleepSync(3000);
    return 1;
    }

  • 資深大佬 : ericls

    这个需要写一个函数把主线程 block 3 秒,可能可以使用一些数学运算和循环之类的

    否则在 javascript 里面,很难 block 主线程

  • 資深大佬 : ericls

    @Kasumi20 你这个返回的是 promise
    @leopod1995 你这个返回 undefined

  • 資深大佬 : Biwood

    @Kasumi20 #7
    我点了感谢,不过仔细想想好像也不符合题目描述,要求“返回 1”,严格来讲 async 函数返回的是 Promise 对象,而不是 1 。上说用 setTimeout 好像也不对,因为计时器的回调函数的返回值不是外层函数的返回值。这样看能只能用阻塞主线程,用 Date.now()计数 3 秒再返回。

  • 資深大佬 : Biwood

    function foo() {
    const start = Date.now();
    while (Date.now() – start < 3000) {}
    return 1;
    }

  • 資深大佬 : Kasumi20

    @ericls 敢在项目里动这种念头,你怕不是要被打屎

  • 資深大佬 : ericls

    @Kasumi20 这个题你还能怎么解? 自己改一个 runtime?

  • 資深大佬 : Kasumi20

    @murmur #4

    这个可以根据变量提升原则来实现:

    console.log(“要求这句话立即输出”,new Date());
    setTimeout(()=>{console.log(“要求这句话 3 秒后输出”,new Date());},1);
    // todo:要求不改动上面代码,这行后面写一段代码完成上面的需求。

    function setTimeout(func) {
    globalThis.setTimeout(func, 3000);
    }

  • 主 資深大佬 : 1sm23

    @leopod1995 #2 你这个一执行就返回 undefined 啦

  • 資深大佬 : enchilada2020

    @autoxbc 感觉这个靠谱

  • 資深大佬 : gBurnX

    最科学的方法 ,应该是把函数调用,改为框架调用。这样你就可以在框架里,利用各种 promise 、setTimeout 了。甚至还可以加入查询进度的功能。

    简单来说,把
    A 调用函数 B,改为

    A 调用框架 B 。并且把调用过程,改为 2 个过程:
    1.A 调用框架 B,并且发送参数、处理函数与回调函数。
    2.框架 B 开始执行处理函数,执行完毕后,开发可以利用任何方法,延迟 3 秒。
    3.延迟 3 秒后,框架 B 执行回调函数来通知 A 。
    4.在 2 与 3 之间,甚至 A 还可以调用框架 B,来查询处理进度。

  • 資深大佬 : akatquas

    @leopod1995 你这返回值,被谁接住了? 谁能拿到这个返回的 1 ?

  • 資深大佬 : cenbiq

    fun block(){
    var startAt = Date.now()
    while(true) {
    if (Date.now() – startAt >= 3000) {
    return 1;
    }
    }
    }

  • 資深大佬 : zzh7982

    @cenbiq 同样的想法

  • 主 資深大佬 : 1sm23

    @cenbiq 直呼牛逼

  • 資深大佬 : cczeng

    睡眠排序的兄弟?

  • 資深大佬 : rodrick

    昨天问了我怎么在代码里区分是 http1 还是 2,回来查了一下就找到一个 window.chrome.loadTimes().connectionInfo

  • 資深大佬 : togou

    return new Promise(r=>setTimeout(r(1),3000));

  • 資深大佬 : zhuweiyou

    await new Promise(resolve => setTimeout(resolve, 3000))

  • 主 資深大佬 : 1sm23

    @togou 不行,返回 Promise

  • 資深大佬 : q673115816

    await new Promise(resolve => setTimeout(resolve, 3000, 1))

  • 資深大佬 : pkupyx

    卡死当前线程的都 OK,答案自己跑一下就试出来能不能过了,主要考察对 JS 线程与任务调度的理解。

  • 資深大佬 : xutao881

    。。。这个需求用来骗甲方好给自己留有优化的余地么?直接阻塞线程可还行

  • 資深大佬 : shilyx

    其实这个题在问:
    “既然你说你懂 JS,那么能否用 JS 证明你不懂 JS ?“

  • 資深大佬 : cxe2v

    @autoxbc
    @enchilada2020
    这代码跑了,不靠谱

  • 資深大佬 : autoxbc

    @cxe2v 那个代码是对 #4 题目的,不是主的题目

  • 資深大佬 : cxe2v

    @autoxbc 我就是对的 4 的题目跑的啊,不会间隔三秒输出,我在浏览器控制台跑的

  • 資深大佬 : autoxbc

    @cxe2v 那你再仔细检查一下吧,我在 firefox,vivaldi,node,deno 各跑了一次。另外为了排版,缩进那里有全角空格,要手工去掉

  • 資深大佬 : libook

    理论上来说,3 秒后返回 1,应该是需要阻塞线程的,否则只能立即返回 promise,然后 3 秒后接收到值。

  • 資深大佬 : lwlizhe

    好像 java 的类加载机制这块范例中有这种类似的,可惜这里是 js……

  • 資深大佬 : djs

    var fun = () => {
    var star = new Date().getTime();
    let t = new Date().getTime();
    while (t – star < 3000) {
    t = new Date().getTime();
    }
    return 1;
    };

  • 資深大佬 : djs

    @djs #37 我把线程阻塞掉 3s- -,不懂符不符合

  • 資深大佬 : rrfeng

    谁给我解释一下,这不就是个 sleep(3s) 的问题吗?还是我理解错了?

    js 里没法实现 sleep 吗?

  • 資深大佬 : autoxbc

    @rrfeng #39 js 可以 sleep,不过要用异步实现。异步的话原函数就需要先返回 promise,等 sleep 结束 resolve 出原始返回值

    而这里题目不允许修改函数返回值,也就不能异步,必须同步实现,只能用死循环阻塞住同步任务

    本质上不是问生产代码怎么写,而是加个不必要的预设,逼你用些奇技淫巧,目的是考察对任务调度的理解

  • 資深大佬 : cxe2v

    @autoxbc 好了,我找到我的问题出在哪儿了

  • 資深大佬 : dd112389

    这个只能阻塞主线程来做吧, 异步基本都是在局部域里面, 拿不到返回值的.
    之前看过腾讯云的 cos sdk, 忘了是 v 几, 就是阻塞主线程等待对象初始化完毕.
    现在好像都改异步了.

  • 資深大佬 : fy136649111

    还可以这样
    function sleep(){
    Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 3000);
    }

  • 資深大佬 : fy136649111

    @fy136649111 function sleep(){
    Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 3000);
    return 1;
    }

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具