1
IGJacklove 2021-04-23 08:52:51 +08:00 via Android
这有什么好比的。。。。那你要是十个异步你嵌套十个 then 吗?
|
2
James369 OP @IGJacklove 嵌套总比使用不当好吧
|
3
renmu123 2021-04-23 08:55:47 +08:00 via Android 1
u=login()
othertask() await u getuserinfo () js 是这样的 |
4
dzdh 2021-04-23 08:55:54 +08:00
如果你 then 里面要做多步且必须要每一步需要前一个返回值呢。嵌套吗
|
5
treblex 2021-04-23 08:57:40 +08:00 2
如果下一步需要上一步的结果就用 await 转成同步,否则都直接 then
```dart var uid = await login().then((u) { return u.id ); otherTask(uid); ``` |
6
pabupa 2021-04-23 08:57:42 +08:00 via Android
await 是为了避免回调地狱的语法糖,他的实现方式也是回调。
至于非阻塞的调用,你需要使用 wait 方法(传入多个 future )。 |
7
ymcz852 2021-04-23 09:00:46 +08:00
用 async/await 一样的,还美观点
方式一: otherTask(); await u = login(); getUserInfo(u); |
8
free9fw 2021-04-23 09:02:20 +08:00
await 解决 callback hell 的
|
9
belin520 2021-04-23 09:05:06 +08:00 via iPhone
不知道从何说起,楼主还是继续用 promise 吧
|
10
walpurgis 2021-04-23 09:06:38 +08:00 via Android 5
await 外面再套一层 async 就行了
(async()=>{ await u = login(); getUserInfo(u); })(); otherTask(); |
11
hereIsChen 2021-04-23 09:08:59 +08:00 1
这个看习惯,我都是混着用的,容易出问题的就用 then catch
层数多的就用 await |
12
IGJacklove 2021-04-23 09:10:09 +08:00 via Android
感觉你刚学编程没多久的样子。。。
|
13
whileFalse 2021-04-23 09:12:44 +08:00
@walpurgis 你可真是个小机灵鬼
|
14
yunyuyuan 2021-04-23 09:14:38 +08:00
哈哈,居然有这种问题。
单手拿手机好还是双手拿手机好? |
15
learningman 2021-04-23 09:23:31 +08:00 via Android
await 其实不是等待,你可以理解为暂停的只有当前线程,CPU 在 await 的时间内干别的去了
这种说法很不准确,推荐你了解协程相关的内容 |
16
wunonglin 2021-04-23 09:24:12 +08:00
rxjs 得永生
|
17
lneoi 2021-04-23 09:27:32 +08:00
这不是哪个好的问题吧 如果这种不必等待的 本来就不能让他被卡住 使用 await 之前应该注意避免这种情况的
|
18
cxe2v 2021-04-23 09:28:30 +08:00
otherTask 不需要等待前面的结果的话,你把它放在 await 前面不就行了?
|
19
rogi 2021-04-23 09:28:36 +08:00
不喜欢 then 链,还是喜欢 async/await 这种写法,同步发送异步请求的方法楼上已经说了
|
20
acmore 2021-04-23 09:44:05 +08:00
“因为 await 需要等待返回才继续向下执行” 说明你还在用同步思维来异步编程。
可以试着想一下程序不是 “向下” 执行的,而是多个单元同时执行的,相较于早早地完成下一步,所有单元整体上尽早完成才是更重要的。 如果你的程序设计是让主线程卡在 await 上了,那么要么用 then,缺点是失去了上下文的同步控制;要么就重新整理一下 code,一定有更好的结构来使用 await. |
21
phony2r 2021-04-23 09:56:21 +08:00
我觉得你的理解有问题
|
22
yaphets666 2021-04-23 10:23:33 +08:00
js 吗 当然 then 好 async 和 await 的异常处理是业界难题 没有统一且玩美的方案
|
23
um1ng 2021-04-23 10:53:19 +08:00
async/await yyds
|
24
Niphor 2021-04-23 11:02:19 +08:00
方式一:
otherTask(); await x = login().then(getUserInfo); 方式二: login().then(getUserInfo); otherTask(); //可以并行 😈 |
25
des 2021-04-23 11:13:12 +08:00
// 不需要 then
pLogin = login(); otherTask(); u = await pLogin; getUserInfo(u); |
26
lonelymarried 2021-04-23 11:28:30 +08:00
必须 await 啊,看起来都舒服些
|
27
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 })); }; ``` |
28
ALVC666 2021-04-23 11:57:25 +08:00
两个其实都是一样的东西
看你预期结果吧 await 我觉得主要是异常处理的写法问题 try catch 我觉得也很不美观 |
29
charlie21 2021-04-23 12:28:28 +08:00 via iPhone
真是敢问敢答阿
|
30
hoyixi 2021-04-23 12:37:25 +08:00 2
你吐槽的 await 槽点,正是 await 诞生的原因,哈哈
好比勺子是用来喝汤之类,用在筷子不方便的场合,而你吐槽:勺子竟然不能像筷子一样夹菜。 |
31
yaphets666 2021-04-23 13:30:29 +08:00
|
32
component 2021-04-23 14:42:04 +08:00
Promise.all Promise.race Promise.allSettled 你们是真不知道还是配合他演戏呢?
|
33
MyouiSouth 2021-04-23 14:52:59 +08:00
@component Promise 跑错片场了,这儿是 dart,应该是 Future.wait (狗头
|
34
TomatoYuyuko 2021-04-23 15:12:47 +08:00
await 最麻烦的地方是 reject 要用 try catch 捕获,处理起来有点麻烦,别的位置倒是用起来很顺手
|
35
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 的问题 应该有更好的解决方法。。 |
36
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'); } } |
37
TomatoYuyuko 2021-04-23 16:56:21 +08:00
@ALVC666 懂了,确实是个方法,相当于封了一层 promise 处理 err...
|
38
gledos 2021-04-23 17:20:54 +08:00
test
|
40
leelz 2021-04-23 21:37:51 +08:00
js 走错片场了。。
|
41
tonyaiken 2021-04-24 00:04:22 +08:00 via iPhone
@IGJacklove 我们公司就是这样写的,嵌套很多层异步。
|
42
IGJacklove 2021-04-24 00:20:10 +08:00 via Android
@tonyaiken 这代码能看。。。。不可能不用 await 只嵌套吧。
|
43
tonyaiken 2021-04-24 03:41:14 +08:00 via iPhone
@IGJacklove 能看,可以分离出单独的方法。就变成方法嵌套方法。
|
44
tonyaiken 2021-04-24 03:45:41 +08:00 via iPhone
@IGJacklove 这是我们公司开源的内部使用的异步框架 https://github.com/linkedin/parseq
|
45
xiubin 2021-04-24 12:05:44 +08:00
笑死了。。一个苦逼 iOS er 一直等带能使用 await 。。。居然举这么个例子。。
|
46
williamx 2021-04-30 07:42:03 +08:00 via Android 1
使用的场景不同,很多时候就是要等上一条执行完了才执行下一条,有时候不需要等待只需要执行完的通知,那么就用 then,否则就是 await,有时侯不想每个都加 async 或者有些函数不能加,那只能用 then 。
|