V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
LightingX
V2EX  ›  问与答

JavaScript 异步回调的同步问题

  •  
  •   LightingX · May 14, 2018 · 2817 views
    This topic created in 2910 days ago, the information mentioned may be changed or developed.

    下列代码

    /* a */
    getXXX(function(){
        /* b */
    });
    /* c */
    

    如何让 c 在 b 后执行呢?

    12 replies    2018-05-16 08:44:56 +08:00
    asdf123101
        1
    asdf123101  
       May 14, 2018 via Android
    把 c 直接放到 b 后面不好吗
    pheyer
        2
    pheyer  
       May 14, 2018 via iPhone
    Await/async 了解一下
    bucky
        3
    bucky  
       May 14, 2018
    把 c 传进去
    dablwow
        4
    dablwow  
       May 14, 2018
    c 不是自然在 b 后面吗?还是我理解错了?
    ![img.png]( https://s1.ax1x.com/2018/05/14/CrHtUA.png)
    LightingX
        5
    LightingX  
    OP
       May 14, 2018
    @dablwow 对,但是有一种情况是 b 执行得比较慢,然后 b 还没执行完的时候 c 就执行完了,你在 b 放一个 sleep 试试看
    zzNucker
        6
    zzNucker  
       May 14, 2018
    getXXX 写成 generator 或者 async
    LancerComet
        7
    LancerComet  
       May 14, 2018
    ```
    getName((error: Error, name: string) => {
    getAge((error: Error, age: number) => {
    const data = { name. age }
    sendData(data, (error: Error) => {
    // ...
    })
    })
    })

    function getName (callback: (error: Error, name: string) => void) {}
    function getAge (callback: (error: Error, age: number) => void) {}
    function sendData (data: { name: string, age: number }, callback: (error: Error) => void) {}
    ```

    ```
    (async () => {
    try {
    const name = await getName()
    const age = await getAge()
    await send({ name, age })
    } catch (error) {
    // ...
    }
    })()

    function getName (): Promise<string> {}
    function getAge (): Promise<number> {}
    function sendData (data: { name: string, age: number }): Promise<void> {}
    ```
    brickyang
        8
    brickyang  
       May 15, 2018 via iPhone
    一劳永逸的办法是用 Promise 把 getXXX 函数包一层,变成 getXXXAsync(),以后就能像同步一样使用它了,岂不美哉?
    Torpedo
        9
    Torpedo  
       May 15, 2018 via Android
    不是回调都是异步。
    getxxx 如果是同步函数就是 abc,异步操作才是 acb。所以这样不能保证顺序。
    使用 promise 可以保证你那部分代码是"异步的"
    至于把 getxxx 变成同步,除了 aync await 语法糖之外是不行的。毕竟 js 异步模型就是事件循环,阻塞 js 线程是明显出问题的
    shintendo
        10
    shintendo  
       May 15, 2018
    @LightingX

    你说的到底是 b 本身异步,还是 getXXX 异步?
    dablwow
        11
    dablwow  
       May 15, 2018
    @LightingX b 只要是同步代码,再慢也是先于 c 执行完毕的。如果是异步,c 不该写在 getXXX 外面
    tushankaka
        12
    tushankaka  
       May 16, 2018 via Android
    2 楼大哥说的对。promise, asyc/await 可以完美解决。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2507 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 65ms · UTC 06:43 · PVG 14:43 · LAX 23:43 · JFK 02:43
    ♥ Do have faith in what you're doing.