【发布时间】:2018-01-10 18:30:47
【问题描述】:
我有两个async 函数。他们都在等待两个 3 秒的函数调用。但是第二个比第一个快。我认为更快的一个是并行运行,另一个是串行运行。我的假设正确吗?如果是,为什么会发生这种情况,因为这两个函数在逻辑上看起来都是一样的?
function sleep() {
return new Promise(resolve => {
setTimeout(resolve, 3000);
});
}
async function serial() {
await sleep();
await sleep();
}
async function parallel() {
var a = sleep();
var b = sleep();
await a;
await b;
}
serial().then(() => {
console.log("6 seconds over");
});
parallel().then(() => {
console.log("3 seconds over");
});
【问题讨论】:
-
@Mjh Errm,
setTimeout本质上是异步的……而且 OP 代码中的几乎所有其他内容也是异步的…… -
@Frxstrem 除了
setTimeout根本不是异步的。它是一个同步函数,告诉事件循环稍后执行一个函数。这是一个机制,在这段代码中绝对没有异步。哪两个运动部件在不同的执行环境中以不同的速度运动?零。因此,这段代码根本不是异步的。 -
@Mjh 主上下文,
setTimeout的回调,serial和parallel,以及对.then的两个调用的回调,都在不同的执行上下文中运行。跨度> -
@Frxstrem 这一切都在同一个线程中工作,执行上下文没有什么不同,没有两个移动部分,有问题的函数
setTimeout是同步的。模拟异步行为的机制并不意味着某些东西是异步的。但是,嘿,如果你愿意相信它是 - 我只是一个凡人,告诉你一个你不喜欢的故事。 -
@Vadakkumpadath 不管怎样震撼你的世界,如果你无法区分通过事件循环通知线程和实际异步操作的 机制 之间的区别,那么好的,非常好,让我们在 javascript 世界中实现异步 :)
标签: javascript async-await ecmascript-2017