【问题标题】:How to call and wait async function done inside sync function in flutter如何在flutter中调用和等待同步函数内部完成的异步函数
【发布时间】:2021-03-11 16:23:58
【问题描述】:

我想在从同步函数返回之前调用并等待异步函数完成

// 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函数会被框架调用,必须是同步函数。

在颤振中,我无法使用 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);
}

我的问题是如何在同步函数中调用异步函数并等待异步函数完成后再返回。

谢谢。

【问题讨论】:

  • 函数getUser() 是一个Future。所以显然同步语句print(1)会先被执行。
  • 如果您需要等待异步函数完成,您需要使用 await ,并且您只能在异步函数中使用 await ,我猜您正在考虑一些过度工程这里

标签: flutter


【解决方案1】:

能够按照您的要求进行操作基本上会使同步和异步功能之间的区别变得无用(并且我认为会阻塞主线程)。你链接的函数“应该被认为是最后的手段”

我想你想要的是:

Future<bool> checkUser(String username, String pwd) async { 
  var user = await getUser(username); 
  return user.pwd == encodePwd(pwd) ? true : false;
}

【讨论】:

    【解决方案2】:

    这可以通过创建一个任务,然后等待/让步等待任务完成来实现。 Yield 可防止阻塞。

        var result = MyAsyncMethod.InvokeAsync(data);
        result.Start();
    
        while (result.Status != TaskStatus.RanToCompletion)
        {
            System.Threading.Thread.Yield();
        }
    

    【讨论】:

      猜你喜欢
      • 2020-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-07
      • 2019-06-16
      • 1970-01-01
      • 2023-02-10
      相关资源
      最近更新 更多