Как вызвать и дождаться выполнения асинхронной функции внутри функции синхронизации в flutter

#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();
    }