异步中 await 和 then 的区别,哪个更好

2021-04-23 08:48:34 +08:00
 James369
await 虽然简洁。因为 await 需要等待返回才继续向下执行,如果是较耗时的操作就得等待。


方式一:
await u = login();
getUserInfo(u);
otherTask(); // 必须等待 login()返回。


方式二:
login().then((u) {
getUserInfo(u);
);
otherTask(); //可以并行

我觉得 then 更加符合逻辑。
5314 次点击
所在节点    Flutter
46 条回复
IGJacklove
2021-04-23 08:52:51 +08:00
这有什么好比的。。。。那你要是十个异步你嵌套十个 then 吗?
James369
2021-04-23 08:54:53 +08:00
@IGJacklove 嵌套总比使用不当好吧
renmu123
2021-04-23 08:55:47 +08:00
u=login()
othertask()
await u
getuserinfo ()

js 是这样的
dzdh
2021-04-23 08:55:54 +08:00
如果你 then 里面要做多步且必须要每一步需要前一个返回值呢。嵌套吗
treblex
2021-04-23 08:57:40 +08:00
如果下一步需要上一步的结果就用 await 转成同步,否则都直接 then

```dart
var uid = await login().then((u) {
return u.id
);
otherTask(uid);
```
pabupa
2021-04-23 08:57:42 +08:00
await 是为了避免回调地狱的语法糖,他的实现方式也是回调。
至于非阻塞的调用,你需要使用 wait 方法(传入多个 future )。
ymcz852
2021-04-23 09:00:46 +08:00
用 async/await 一样的,还美观点
方式一:
otherTask();
await u = login();
getUserInfo(u);
free9fw
2021-04-23 09:02:20 +08:00
await 解决 callback hell 的
belin520
2021-04-23 09:05:06 +08:00
不知道从何说起,楼主还是继续用 promise 吧
walpurgis
2021-04-23 09:06:38 +08:00
await 外面再套一层 async 就行了

(async()=>{
await u = login();
getUserInfo(u);
})();
otherTask();
hereIsChen
2021-04-23 09:08:59 +08:00
这个看习惯,我都是混着用的,容易出问题的就用 then catch
层数多的就用 await
IGJacklove
2021-04-23 09:10:09 +08:00
感觉你刚学编程没多久的样子。。。
whileFalse
2021-04-23 09:12:44 +08:00
@walpurgis 你可真是个小机灵鬼
yunyuyuan
2021-04-23 09:14:38 +08:00
哈哈,居然有这种问题。
单手拿手机好还是双手拿手机好?
learningman
2021-04-23 09:23:31 +08:00
await 其实不是等待,你可以理解为暂停的只有当前线程,CPU 在 await 的时间内干别的去了
这种说法很不准确,推荐你了解协程相关的内容
wunonglin
2021-04-23 09:24:12 +08:00
rxjs 得永生
lneoi
2021-04-23 09:27:32 +08:00
这不是哪个好的问题吧 如果这种不必等待的 本来就不能让他被卡住 使用 await 之前应该注意避免这种情况的
cxe2v
2021-04-23 09:28:30 +08:00
otherTask 不需要等待前面的结果的话,你把它放在 await 前面不就行了?
rogi
2021-04-23 09:28:36 +08:00
不喜欢 then 链,还是喜欢 async/await 这种写法,同步发送异步请求的方法楼上已经说了
acmore
2021-04-23 09:44:05 +08:00
“因为 await 需要等待返回才继续向下执行” 说明你还在用同步思维来异步编程。
可以试着想一下程序不是 “向下” 执行的,而是多个单元同时执行的,相较于早早地完成下一步,所有单元整体上尽早完成才是更重要的。

如果你的程序设计是让主线程卡在 await 上了,那么要么用 then,缺点是失去了上下文的同步控制;要么就重新整理一下 code,一定有更好的结构来使用 await.

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

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

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

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

© 2021 V2EX