#flutter
#flutter
Вопрос:
Я хочу вызвать и дождаться выполнения асинхронной функции перед возвратом из функции синхронизации
// async function
Future<User> getUser(String username) async {
...
}
В dart я мог бы использовать https://api.dart.dev/stable/2.9.2/dart-cli/waitFor.html чтобы дождаться асинхронной функции, прежде чем перейти к следующему оператору.
bool checkUser(String username, String encodedPwd) {
var user = waitFor<User>(getUser(username));
if (user.pwd == encodedPwd)
return true;
else
return false;
}
Поскольку требуется фреймворк, функция CheckUser будет вызываться фреймворком и должна быть функцией синхронизации.
Во flutter я не мог использовать dart: cli, я реализую по шаблону .then() .whenComplete() , но при вызове CheckUser оператор print(1) будет вызывать и завершать функцию, не дожидаясь завершения getUser.
bool checkUser(String username, String pwd) {
getUser(username).then((user) {
if (user.pwd == encodePwd(pwd)) {
return true;
} else {
return false;
}
);
print(1);
}
Мой вопрос заключается в том, как вызвать асинхронную функцию внутри функции синхронизации и дождаться выполнения асинхронной функции перед возвратом.
Спасибо.
Комментарии:
1. Функция
getUser()
— это будущее. Итак, очевидно, что оператор синхронизацииprint(1)
будет выполнен первым.2. если вам нужно дождаться завершения асинхронной функции, которую вам нужно использовать
await
, и вы можете использовать толькоawait
внутри асинхронной функции, я думаю, вы думаете о некоторой чрезмерной разработке здесь
Ответ №1:
Возможность делать то, что вы просите, в основном сделает различие между функциями синхронизации и асинхронности бесполезным (и, я думаю, заблокирует основной поток). Функция, которую вы связали, «должна рассматриваться как последнее средство».
Я думаю, что вы хотите :
Future<bool> checkUser(String username, String pwd) async {
var user = await getUser(username);
return user.pwd == encodePwd(pwd) ? true : false;
}
Ответ №2:
Этого можно достичь, создав задачу, а затем дождавшись / дождавшись завершения задачи. Выход предотвращает блокировку.
var result = MyAsyncMethod.InvokeAsync(data);
result.Start();
while (result.Status != TaskStatus.RanToCompletion)
{
System.Threading.Thread.Yield();
}