Будущее.отложенное выполнение

#dart

Вопрос:

Есть какой-нибудь пример.

 void main() {  A a = A();  transform(a);  print(a.str   ' sync'); }  Futurelt;voidgt; transform(A a) async {  await Future.delayed(Duration(seconds: 3), () =gt; a.str = 'B');  print(a.str   ' async'); }  class A {  String str = 'A'; }  

И выход:

 A sync B async  

И следующий пример

 void main() {  A a = A();  transform(a);  print(a.str   ' sync'); }  Futurelt;voidgt; transform(A a) async {  Function f = () {  a.str = 'B';  };  await Future.delayed(Duration(seconds: 3), f());  print(a.str   ' async'); }  class A {  String str = 'A'; }  

С выходом:

 B sync B async  

Правильно ли я думаю, что f() выполняется, но просто не возвращается во втором случае, поэтому я получил значение a.str, измененное незаметно и возвращенное позже? Или какой правильный ответ?

Комментарии:

1. Во втором примере вы вызываете функцию f сразу же после написания f() . Возвращенное значение этого выполнения затем используется в качестве второго аргумента для Future.delayed . Если вы хотите предоставить функцию в качестве параметра Future.delayed , вам следует использовать f (без () ).

2. Я думал, что функция f=(){a.str=’B’;}; объявляет только f (), вызывает комментарии // ждут будущего. задержка(Длительность(секунды: 3),f()); дает мне асинхронную синхронизацию

3. Это не та декларация, с которой возникает проблема. Это то, как вы впоследствии ссылаетесь на функцию. Функция сохраняется внутри переменной с именем f . Если вы делаете () это с переменной, вы выполняете функцию, которая f ссылается на. 🙂

4. о, извините меня. я не очень внимательно прочитал ваш первый комментарий. Спасибо.

5. ОК. Я опубликовал ответ, который вы можете принять, если мы закончим. Пожалуйста, просто скажите мне, если вам нужна дополнительная информация, связанная с этим вопросом. 🙂

Ответ №1:

Во втором примере у вас есть следующая строка:

 await Future.delayed(Duration(seconds: 3), f());  

То, что вы здесь делаете, — это выполнение функции, на которую указывает переменная f , и использование результата этого метода в качестве второго аргумента Future.delaye . Причина этого в том , что у вас есть () сразу после имени переменной f , которое используется для указания на то, что вы хотите выполнить указанный метод f без каких-либо аргументов.

Что вам следовало бы сделать вместо этого (если вы хотите отправить саму функцию в качестве второго аргумента Future.delayed ), так это просто использовать f :

 await Future.delayed(Duration(seconds: 3), f);  

Комментарии:

1. Я знаю, я просто подумал, что меня ждет Будущее. задержка(Длительность(секунды: 3), f()) начинает выполнение функции f() через 3 секунды, но кажется, что она выполняет ее мгновенно и просто возвращает результат через 3 секунды.

2. @ArtT Да. Потому await что используется ожидание от выполнения возвращенного будущего Future.delayed . Так Future.delayed выполняется, возвращает будущее, и мы ждем этого. Таким образом, все параметры to Future.delayed решаются перед вызовом Future.delayed . И в вашем случае выполнение f() означает, что вы хотите выполнить f и использовать возвращенное значение в качестве параметра to Future.delayed .

Ответ №2:

 await Future.delayed(Duration(seconds: 3),(){f();});  

вот чего я хотел

Комментарии:

1. То, что вы здесь делаете, — это предоставляете новую функцию (без ее немедленного выполнения) в качестве аргумента, к Future.delayed которому она будет вызываться позже f() . Этот пример более или менее такой же, как если бы вы только что привели f в качестве аргумента мое предлагаемое решение.