异步中 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 更加符合逻辑。
5316 次点击
所在节点    Flutter
46 条回复
phony2r
2021-04-23 09:56:21 +08:00
我觉得你的理解有问题
yaphets666
2021-04-23 10:23:33 +08:00
js 吗 当然 then 好 async 和 await 的异常处理是业界难题 没有统一且玩美的方案
um1ng
2021-04-23 10:53:19 +08:00
async/await yyds
Niphor
2021-04-23 11:02:19 +08:00
方式一:
otherTask();
await x = login().then(getUserInfo);

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

😈
des
2021-04-23 11:13:12 +08:00
// 不需要 then
pLogin = login();
otherTask();
u = await pLogin;
getUserInfo(u);
lonelymarried
2021-04-23 11:28:30 +08:00
必须 await 啊,看起来都舒服些
huijiewei
2021-04-23 11:36:07 +08:00
@yaphets666

```
export const flatry = <T, E>(promise: Promise<T>): Promise<{ data: T | undefined; error: E | undefined }> => {
return promise.then((data) => ({ data, error: undefined })).catch((error) => ({ data: undefined, error }));
};
```
ALVC666
2021-04-23 11:57:25 +08:00
两个其实都是一样的东西
看你预期结果吧
await 我觉得主要是异常处理的写法问题
try catch 我觉得也很不美观
charlie21
2021-04-23 12:28:28 +08:00
真是敢问敢答阿
hoyixi
2021-04-23 12:37:25 +08:00
你吐槽的 await 槽点,正是 await 诞生的原因,哈哈
好比勺子是用来喝汤之类,用在筷子不方便的场合,而你吐槽:勺子竟然不能像筷子一样夹菜。
yaphets666
2021-04-23 13:30:29 +08:00
@huijiewei 没看太懂 意思 flatry 是一个函数 把 await xxxx 传进去转换成 promsie 返回?
@ALVC666 try catch 有时候捕获不到 await 结果的错误
component
2021-04-23 14:42:04 +08:00
Promise.all Promise.race Promise.allSettled 你们是真不知道还是配合他演戏呢?
MyouiSouth
2021-04-23 14:52:59 +08:00
@component Promise 跑错片场了,这儿是 dart,应该是 Future.wait (狗头
TomatoYuyuko
2021-04-23 15:12:47 +08:00
await 最麻烦的地方是 reject 要用 try catch 捕获,处理起来有点麻烦,别的位置倒是用起来很顺手
TomatoYuyuko
2021-04-23 15:25:04 +08:00
最近在用 async/await 做接口封装遇到了 catch 的坑,最后用了一种不太好的办法处理
// response 拦截
// showStatus 是用来弹框提示状态码国际化标语的方法
...
catch (err) {
reject({ code: err.status, msg: showStatus(err.status), data: null })
}

//post 方法的拦截
...
catch (err) {
return new Promise(resolve => {
resolve({
code: -1,
msg: '',
data: null
})
})
}
// 具体接口封装
...
if(res.code !== -1){
...
强行 resolve,这样就避开了在 api 部分写太多 try catch 的问题
应该有更好的解决方法。。
ALVC666
2021-04-23 15:30:31 +08:00
@TomatoYuyuko
我是参考了这个
https://blog.grossman.io/how-to-write-async-await-without-try-catch-blocks-in-javascript/

import to from './to.js';

async function asyncTask() {
let err, user, savedTask;

[err, user] = await to(UserModel.findById(1));
if(!user) throw new CustomerError('No user found');

[err, savedTask] = await to(TaskModel({userId: user.id, name: 'Demo Task'}));
if(err) throw new CustomError('Error occurred while saving task');

if(user.notificationsEnabled) {
const [err] = await to(NotificationService.sendNotification(user.id, 'Task Created'));
if (err) console.error('Just log the error and continue flow');
}
}
TomatoYuyuko
2021-04-23 16:56:21 +08:00
@ALVC666 懂了,确实是个方法,相当于封了一层 promise 处理 err...
gledos
2021-04-23 17:20:54 +08:00
test
chengxy
2021-04-23 17:36:16 +08:00
@component #32 他们估计都不知道 Promise.all...
leelz
2021-04-23 21:37:51 +08:00
js 走错片场了。。

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

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

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

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

© 2021 V2EX