这两个函数是
Future<int> functinoA() {
return Future.delayed(const Duration(seconds: 3), () => 1);
}
Future<int> functionB() async {
return await Future.delayed(const Duration(seconds: 3), () => 1);
}
虽然创建由函数A创建的对象A和由函数B创建的对象B都需要3秒钟,但在它们的后续调用中是否存在时间滞后?
我的理解是,对象A每次被调用时都会延迟三秒,因为它是在创建时创建的具有3秒延迟属性的对象。
另一方面,对象B是在创建过程中等待3秒创建的没有延迟属性的对象,所以每次调用都可以立即调用,这个区别是由于使用了async和await。
- 如果我的理解不正确,请告诉我这两个函数的区别,以及使用async和await的区别。**
另外,如果我的理解是正确的话,如何为这两个对象写一个自加函数,让对象的时间差看得很清楚呢?我尝试了几种方法来看自加方程造成的时间滞后,但有可能是我写的方程太简单,计算效率太高,看不出效果,也有可能是我的理解错了。
1条答案
按热度按时间fhity93d1#
在我看来,你对aync/await的阅读太多了,它们只是一种更好的异步语法,这样你就不会以一堆嵌套的回调结束,它们不会改变对象是如何创建和重用的。
不过这很容易测试,试着运行以下代码:
这导致:
参见this gist。
现在,谈谈发生了什么。
在函数A中,你返回一个Future,它在延迟3秒后返回1,每次你调用函数A,它都会创建一个新的Future,每次你等待它完成都需要3秒。
在函数B中,你所做的实际上非常相似,你仍然在创建一个新的future,每次函数被调用时,它都要等待3秒才能返回,但是
await
只是意味着它要等到future完成,然后在从函数返回之前执行一个noop。你可以把
async/await
看作是Futures之上的语法糖,所以如果你把它“解开”,函数B看起来就像这样:当函数这么短的时候,没有太大的区别,但是如果我们看一看一个更长的函数,就可能更清楚为什么async/await是有用的。
可以翻译成:
第二个函数要难读得多,而第一个函数可以像普通代码一样读,实际上你甚至可以这样写它,使它更易读: