#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
выполняется, возвращает будущее, и мы ждем этого. Таким образом, все параметры toFuture.delayed
решаются перед вызовомFuture.delayed
. И в вашем случае выполнениеf()
означает, что вы хотите выполнитьf
и использовать возвращенное значение в качестве параметра toFuture.delayed
.
Ответ №2:
await Future.delayed(Duration(seconds: 3),(){f();});
вот чего я хотел
Комментарии:
1. То, что вы здесь делаете, — это предоставляете новую функцию (без ее немедленного выполнения) в качестве аргумента, к
Future.delayed
которому она будет вызываться позжеf()
. Этот пример более или менее такой же, как если бы вы только что привелиf
в качестве аргумента мое предлагаемое решение.