关于 async function 的设计哲学:如何评价 await 一个 resolved 的 promise 会使上下文拆成两个 tick ?

2017-02-13 21:05:54 +08:00
 dou4cc
4458 次点击
所在节点    JavaScript
49 条回复
limhiaoing
2017-02-14 14:52:02 +08:00
@morethansean

task 或者 future/promise 抽象并不一定要异步,可以是延后执行,现在在上班,晚上再具体回复你。
dou4cc
2017-02-14 15:49:35 +08:00
@otakustay 这两条语句间没有顺承关系,我觉得无所谓哪条先执行
thuanqin
2017-02-14 16:14:00 +08:00
可能编译器可以直接处理这种情况将异步代码转为同步代码执行,不过会带来增加编译时间等开销吧。
jarlyyn
2017-02-14 16:19:56 +08:00
那么不想写异步代码楼主还是写 go 吧。
zhouyg
2017-02-14 16:34:33 +08:00
async 只是语法糖而已,本质还是 Promise ,既然是 Promise 那当然是异步的,因为 Promise 就是这么设计的。
Clarencep
2017-02-14 18:05:04 +08:00
limhiaoing
2017-02-14 21:34:50 +08:00
@morethansean
``` cs
var task = Task.FromResult<int>(1 + 2);
new Action(async () => {
await task;
Console.WriteLine("1");
})();
Console.WriteLine("2");
// Output:
// 1
// 2
```
``` cs
var task = Task.Delay(1); // delay 1ms
new Action(async () => {
await task;
Console.WriteLine("1");
})();
Console.WriteLine("2");
// Output:
// 2
// 1
```
C#的 async 、 await 是这样的,立即可以完成(代码 1 )的,可以同步执行先输出 1 再输出 2 ,需要 1ms 才能完成的(代码 2 ),才必须异步先输出 2 再输出 1 。
C#应该是最早使用 async 、 await 语法糖的语言,之后才被各语言争相效仿(如果有更早的请指正),这种允许同步执行的 await 也被证明设计上没有错误,所以 ES7 如果是强制异步的话,就是设计哲学的问题了。
limhiaoing
2017-02-14 21:42:00 +08:00
@limhiaoing
而关于 future/promise 用于延后执行,可以看下这个。
http://en.cppreference.com/w/cpp/thread/async
std::launch::deferred enable lazy evaluation
xieranmaya
2017-02-14 23:40:08 +08:00
因为 Promise 的 resolved/rejected callback 是异步执行的。就将。

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

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

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

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

© 2021 V2EX