Flutter 开发中异步处理:await 和 then 的区别,哪个更好

发布于 1周前 作者 vueper 来自 Flutter

await 虽然简洁。因为 await 需要等待返回才继续向下执行,如果是较耗时的操作就得等待。


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


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

我觉得 then 更加符合逻辑。
Flutter 开发中异步处理:await 和 then 的区别,哪个更好

47 回复

这有什么好比的。。。。那你要是十个异步你嵌套十个 then 吗?

更多关于Flutter 开发中异步处理:await 和 then 的区别,哪个更好的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


嵌套总比使用不当好吧

u=login()
othertask()
await u
getuserinfo ()

js 是这样的

如果你 then 里面要做多步且必须要每一步需要前一个返回值呢。嵌套吗

如果下一步需要上一步的结果就用 await 转成同步,否则都直接 then

dart<br>var uid = await login().then((u) {<br> return <a target="_blank" href="http://u.id" rel="nofollow noopener">u.id</a><br>);<br>otherTask(uid); <br>

await 是为了避免回调地狱的语法糖,他的实现方式也是回调。
至于非阻塞的调用,你需要使用 wait 方法(传入多个 future )。

用 async/await 一样的,还美观点
方式一:
otherTask();
await u = login();
getUserInfo(u);

await 解决 callback hell 的

不知道从何说起,楼主还是继续用 promise 吧

await 外面再套一层 async 就行了

(async()=>{
await u = login();
getUserInfo(u);
})();
otherTask();

这个看习惯,我都是混着用的,容易出问题的就用 then catch
层数多的就用 await

感觉你刚学编程没多久的样子。。。

你可真是个小机灵鬼

哈哈,居然有这种问题。
单手拿手机好还是双手拿手机好?

await 其实不是等待,你可以理解为暂停的只有当前线程,CPU 在 await 的时间内干别的去了
这种说法很不准确,推荐你了解协程相关的内容

rxjs 得永生

这不是哪个好的问题吧 如果这种不必等待的 本来就不能让他被卡住 使用 await 之前应该注意避免这种情况的

otherTask 不需要等待前面的结果的话,你把它放在 await 前面不就行了?

不喜欢 then 链,还是喜欢 async/await 这种写法,同步发送异步请求的方法楼上已经说了

“因为 await 需要等待返回才继续向下执行” 说明你还在用同步思维来异步编程。
可以试着想一下程序不是 “向下” 执行的,而是多个单元同时执行的,相较于早早地完成下一步,所有单元整体上尽早完成才是更重要的。

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

我觉得你的理解有问题

js 吗 当然 then 好 async 和 await 的异常处理是业界难题 没有统一且玩美的方案

async/await yyds

方式一:
otherTask();
await x = login().then(getUserInfo);

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

😈

// 不需要 then
pLogin = login();
otherTask();
u = await pLogin;
getUserInfo(u);

必须 await 啊,看起来都舒服些



<br>export const flatry = &lt;T, E&gt;(promise: Promise&lt;T&gt;): Promise&lt;{ data: T | undefined; error: E | undefined }&gt; =&gt; {<br> return promise.then((data) =&gt; ({ data, error: undefined })).catch((error) =&gt; ({ data: undefined, error }));<br>};<br>

两个其实都是一样的东西
看你预期结果吧
await 我觉得主要是异常处理的写法问题
try catch 我觉得也很不美观

真是敢问敢答阿

你吐槽的 await 槽点,正是 await 诞生的原因,哈哈
好比勺子是用来喝汤之类,用在筷子不方便的场合,而你吐槽:勺子竟然不能像筷子一样夹菜。

没看太懂 意思 flatry 是一个函数 把 await xxxx 传进去转换成 promsie 返回?
try catch 有时候捕获不到 await 结果的错误

Promise.all Promise.race Promise.allSettled 你们是真不知道还是配合他演戏呢?

Promise 跑错片场了,这儿是 dart,应该是 Future.wait (狗头

await 最麻烦的地方是 reject 要用 try catch 捕获,处理起来有点麻烦,别的位置倒是用起来很顺手

最近在用 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 的问题
应该有更好的解决方法。。


我是参考了这个
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’);
}
}

懂了,确实是个方法,相当于封了一层 promise 处理 err…

#32 他们估计都不知道 Promise.all…

js 走错片场了。。

我们公司就是这样写的,嵌套很多层异步。

这代码能看。。。。不可能不用 await 只嵌套吧。

能看,可以分离出单独的方法。就变成方法嵌套方法。

这是我们公司开源的内部使用的异步框架 https://github.com/linkedin/parseq

笑死了。。一个苦逼 iOS er 一直等带能使用 await 。。。居然举这么个例子。。

使用的场景不同,很多时候就是要等上一条执行完了才执行下一条,有时候不需要等待只需要执行完的通知,那么就用 then,否则就是 await,有时侯不想每个都加 async 或者有些函数不能加,那只能用 then 。

在Flutter开发中,异步处理是一个常见的需求,awaitthen是处理异步操作的两种不同方式,它们各有特点和适用场景。

await关键字用于等待一个异步操作完成,并将异步操作的结果作为返回值。它只能在异步函数(即被async关键字修饰的函数)内部使用,并且会使代码的执行暂停,直到等待的异步操作完成。这种方式使得代码看起来更像是同步的,有助于提升代码的可读性和维护性。

then方法则是Promise对象的一个回调,用于在异步操作完成后执行特定的操作。它不会阻塞代码的执行,而是当异步操作完成时,通过回调函数来处理结果。这种方式更加灵活,适用于需要在异步操作完成后执行多个不同操作的情况。

至于哪个更好,这取决于具体的使用场景。如果只需要等待一个异步操作完成并获取其结果,那么await可能更加直观和简洁。如果需要处理多个异步操作的结果,或者希望在异步操作完成后执行多个不同的操作,那么then方法可能更加合适。

总的来说,awaitthen都是处理异步操作的有效方式,它们各有优缺点。在实际开发中,应根据具体需求和代码风格来选择使用哪种方式。无论选择哪种方式,都应确保异步操作得到正确处理,以避免出现潜在的错误和性能问题。

回到顶部