Flutter 开发中异步处理:await 和 then 的区别,哪个更好
await 虽然简洁。因为 await 需要等待返回才继续向下执行,如果是较耗时的操作就得等待。
方式一:
await u = login();
getUserInfo(u);
otherTask(); // 必须等待 login()返回。
方式二:
login().then((u) {
getUserInfo(u);
);
otherTask(); //可以并行
我觉得 then 更加符合逻辑。
Flutter 开发中异步处理:await 和 then 的区别,哪个更好
这有什么好比的。。。。那你要是十个异步你嵌套十个 then 吗?
更多关于Flutter 开发中异步处理:await 和 then 的区别,哪个更好的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
嵌套总比使用不当好吧
u=login()
othertask()
await u
getuserinfo ()
js 是这样的
如果你 then 里面要做多步且必须要每一步需要前一个返回值呢。嵌套吗
如果下一步需要上一步的结果就用 await 转成同步,否则都直接 thendart<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 = <T, E>(promise: Promise<T>): Promise<{ data: T | undefined; error: E | undefined }> => {<br> return promise.then((data) => ({ data, error: undefined })).catch((error) => ({ 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…
test
#32 他们估计都不知道 Promise.all…
js 走错片场了。。
我们公司就是这样写的,嵌套很多层异步。
这代码能看。。。。不可能不用 await 只嵌套吧。
能看,可以分离出单独的方法。就变成方法嵌套方法。
这是我们公司开源的内部使用的异步框架 https://github.com/linkedin/parseq
笑死了。。一个苦逼 iOS er 一直等带能使用 await 。。。居然举这么个例子。。
使用的场景不同,很多时候就是要等上一条执行完了才执行下一条,有时候不需要等待只需要执行完的通知,那么就用 then,否则就是 await,有时侯不想每个都加 async 或者有些函数不能加,那只能用 then 。
在Flutter开发中,异步处理是一个常见的需求,await
和then
是处理异步操作的两种不同方式,它们各有特点和适用场景。
await
关键字用于等待一个异步操作完成,并将异步操作的结果作为返回值。它只能在异步函数(即被async
关键字修饰的函数)内部使用,并且会使代码的执行暂停,直到等待的异步操作完成。这种方式使得代码看起来更像是同步的,有助于提升代码的可读性和维护性。
then
方法则是Promise对象的一个回调,用于在异步操作完成后执行特定的操作。它不会阻塞代码的执行,而是当异步操作完成时,通过回调函数来处理结果。这种方式更加灵活,适用于需要在异步操作完成后执行多个不同操作的情况。
至于哪个更好,这取决于具体的使用场景。如果只需要等待一个异步操作完成并获取其结果,那么await
可能更加直观和简洁。如果需要处理多个异步操作的结果,或者希望在异步操作完成后执行多个不同的操作,那么then
方法可能更加合适。
总的来说,await
和then
都是处理异步操作的有效方式,它们各有优缺点。在实际开发中,应根据具体需求和代码风格来选择使用哪种方式。无论选择哪种方式,都应确保异步操作得到正确处理,以避免出现潜在的错误和性能问题。