JavaScript 异步回调的同步问题

2018-05-14 23:10:40 +08:00
 LightingX

下列代码

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

如何让 c 在 b 后执行呢?

2164 次点击
所在节点    问与答
12 条回复
asdf123101
2018-05-14 23:14:42 +08:00
把 c 直接放到 b 后面不好吗
pheyer
2018-05-14 23:16:55 +08:00
Await/async 了解一下
bucky
2018-05-14 23:24:10 +08:00
把 c 传进去
dablwow
2018-05-14 23:42:18 +08:00
c 不是自然在 b 后面吗?还是我理解错了?
![img.png]( https://s1.ax1x.com/2018/05/14/CrHtUA.png)
LightingX
2018-05-14 23:49:03 +08:00
@dablwow 对,但是有一种情况是 b 执行得比较慢,然后 b 还没执行完的时候 c 就执行完了,你在 b 放一个 sleep 试试看
zzNucker
2018-05-14 23:50:59 +08:00
getXXX 写成 generator 或者 async
LancerComet
2018-05-14 23:51:27 +08:00
```
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
2018-05-15 00:24:17 +08:00
一劳永逸的办法是用 Promise 把 getXXX 函数包一层,变成 getXXXAsync(),以后就能像同步一样使用它了,岂不美哉?
Torpedo
2018-05-15 00:44:20 +08:00
不是回调都是异步。
getxxx 如果是同步函数就是 abc,异步操作才是 acb。所以这样不能保证顺序。
使用 promise 可以保证你那部分代码是"异步的"
至于把 getxxx 变成同步,除了 aync await 语法糖之外是不行的。毕竟 js 异步模型就是事件循环,阻塞 js 线程是明显出问题的
shintendo
2018-05-15 09:35:08 +08:00
@LightingX

你说的到底是 b 本身异步,还是 getXXX 异步?
dablwow
2018-05-15 13:50:50 +08:00
@LightingX b 只要是同步代码,再慢也是先于 c 执行完毕的。如果是异步,c 不该写在 getXXX 外面
tushankaka
2018-05-16 08:44:56 +08:00
2 楼大哥说的对。promise, asyc/await 可以完美解决。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/454845

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX