V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
LeungJZ
V2EX  ›  问与答

js 的 async await 说到底还是伪异步吗?

  •  
  •   LeungJZ · 2018-04-02 16:08:35 +08:00 · 2932 次点击
    这是一个创建于 2461 天前的主题,其中的信息可能已经有所发展或是发生改变。

    实践基于 vue

    如下图,左边是 component 的 mounted 函数,右边是 mixin 的 mounted 函数。

    在 vue 中,mixin 的 mounted 会比 component 的先执行。

    所以我当时就想,在 mixin 中先获取数据,再交由 component 处理,因为该 mixin 在两个组件中都用上了。

    可是,事与愿违,mixin 中 await 后的函数还是会等到所有的 mounted 执行完成后才会执行的。

    那么请问一下,我该如何去调整?

    11 条回复    2018-04-02 17:52:32 +08:00
    wwqgtxx
        1
    wwqgtxx  
       2018-04-02 16:11:01 +08:00 via iPhone
    异步执行也没人说就一定是并发执行吧
    LeungJZ
        2
    LeungJZ  
    OP
       2018-04-02 16:15:53 +08:00
    @wwqgtxx
    以为是 await 后的,会等返回结果再执行,原来只限于本函数。
    maichael
        3
    maichael  
       2018-04-02 16:27:38 +08:00
    如果 await 后所有代码都要等返回回来再执行,那叫阻塞。

    阻塞和非阻塞,和你是异步还是不是异步一点关系都没有。
    LeungJZ
        4
    LeungJZ  
    OP
       2018-04-02 16:35:29 +08:00
    @maichael
    好吧,表达错了。
    wwqgtxx
        5
    wwqgtxx  
       2018-04-02 17:03:37 +08:00 via iPhone
    @LeungJZ 本质上 await 是用 switch 实现的,你可以用 babel 转码成 es5 看看就知道了,所以他的作用域局限于 async 函数内
    Yuiham
        6
    Yuiham  
       2018-04-02 17:03:52 +08:00
    mixins 和组件提供的生命周期钩子会在组件初始化的时候合并成数组。但是生命周期钩子的调用是同步的顺序的,调用完第一个 mounted 后接着调用第二个。你的 mixins 提供的 mounted 里的请求响应至少得到下一轮事件循环了
    LeungJZ
        7
    LeungJZ  
    OP
       2018-04-02 17:05:09 +08:00
    @Yuiham
    但是事件处理弄到 setTimeout 还是不行。
    Yuiham
        8
    Yuiham  
       2018-04-02 17:19:29 +08:00
    @LeungJZ 你在组件的 created 中用 $once 监听一个事件 a,注册 callback。接着等 mixins 的 mounted 拿到响应数据,带上数据 emit 这个事件 a。这样可以干掉多余的本地状态和生命周期钩子。
    AJian
        9
    AJian  
       2018-04-02 17:21:01 +08:00
    只是对语法糖而已
    crs0910
        10
    crs0910  
       2018-04-02 17:50:20 +08:00
    mixin 里写成 method,然后 component 的 amounted 钩子里面 await 调用
    LeungJZ
        11
    LeungJZ  
    OP
       2018-04-02 17:52:32 +08:00
    @crs0910
    这是我现在唯一能想到的解决办法。


    @Yuiham
    这个方法好像不错。我试试,谢谢了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2761 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 02:32 · PVG 10:32 · LAX 18:32 · JFK 21:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.