首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么不打印异步函数的结果?

为什么不打印异步函数的结果?
EN

Stack Overflow用户
提问于 2020-07-22 16:52:41
回答 2查看 37关注 0票数 0

在我的颤栗项目中:

代码语言:javascript
复制
Future<Position> getCurrentPosition({
    LocationAccuracy desiredAccuracy = LocationAccuracy.best,
    GeolocationPermission locationPermissionLevel =
        GeolocationPermission.location,
  }) async {

在我的班上:

代码语言:javascript
复制
import 'package:geolocator/geolocator.dart';
import 'package:logger/logger.dart';

class TestAsync {
  var _logger = Logger();

  Future<void> main() async {
    _logger.d("TestAsync: main: Fetching user order...");
    _logger.d(await createOrderMessage());
  }

  Future<String> createOrderMessage() async {
    _logger.d("TestAsync: createOrderMessage: BEFORE_WAIT ");
    var order = await fetchUserOrder();
    return 'TestAsync: createOrderMessage: AFTER_WAIT Your order is: $order';
  }

  Future<Position> fetchUserOrder() async {
    _logger.d("TestAsync: fetchUserOrder: ");
    for (int index = 0; index < 10; index++) {
      Geolocator()
          .getCurrentPosition(desiredAccuracy: LocationAccuracy.high)
          .then((value) {
            _logger.d("TestAsync: fetchUserOrder: index = $index then_value = $value");
      });
    }
  }
}

如您所见,我使用异步函数fetchUserOrder。为了调用这个函数,我使用

代码语言:javascript
复制
 await fetchUserOrder();

因此,结果必须是:

执行fetchUserOrder

完成后的

  1. fetchUserOrder只打印:

is...:TestAsync: createOrderMessage: AFTER_WAIT order AFTER_WAIT

但结果是另一种

代码语言:javascript
复制
I/flutter (11975): │  createState:
I/flutter (11975): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
I/flutter (11975): ┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
I/flutter (11975): │ #0   _SignInScreenState.initState (package:flutter_sample/screens/signin_screen.dart:29:13)
I/flutter (11975): │ #1   StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4649:58)
I/flutter (11975): ├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
I/flutter (11975): │  initState:
I/flutter (11975): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
I/flutter (11975): ┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
I/flutter (11975): │ #0   TestAsync.main (package:flutter_sample/service/TestAsync.dart:26:13)
I/flutter (11975): │ #1   _SignInScreenState.initState (package:flutter_sample/screens/signin_screen.dart:36:21)
I/flutter (11975): ├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
I/flutter (11975): │  TestAsync: main: Fetching user order...
I/flutter (11975): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
I/flutter (11975): ┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
I/flutter (11975): │ #0   TestAsync.createOrderMessage (package:flutter_sample/service/TestAsync.dart:31:13)
I/flutter (11975): │ #1   TestAsync.main (package:flutter_sample/service/TestAsync.dart:27:21)
I/flutter (11975): ├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
I/flutter (11975): │  TestAsync: createOrderMessage: BEFORE_WAIT 
I/flutter (11975): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
I/flutter (11975): ┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
I/flutter (11975): │ #0   TestAsync.fetchUserOrder (package:flutter_sample/service/TestAsync.dart:39:13)
I/flutter (11975): │ #1   TestAsync.createOrderMessage (package:flutter_sample/service/TestAsync.dart:33:23)
I/flutter (11975): ├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
I/flutter (11975): │  TestAsync: fetchUserOrder: 
I/flutter (11975): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
I/flutter (11975): ┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
I/flutter (11975): │ #0   _SignInScreenState.build (package:flutter_sample/screens/signin_screen.dart:41:13)
I/flutter (11975): │ #1   StatefulElement.build (package:flutter/src/widgets/framework.dart:4628:28)
I/flutter (11975): ├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
I/flutter (11975): │  build:
I/flutter (11975): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
I/flutter (11975): ┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
I/flutter (11975): │ #0   TestAsync.main (package:flutter_sample/service/TestAsync.dart:27:13)
I/flutter (11975): │ <asynchronous suspension>
I/flutter (11975): │ #1   _SignInScreenState.initState (package:flutter_sample/screens/signin_screen.dart:36:21)
I/flutter (11975): ├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
I/flutter (11975): │  TestAsync: createOrderMessage: AFTER_WAIT Your order is: null
I/flutter (11975): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
I/flutter (11975): ┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
I/flutter (11975): │ #0   TestAsync.fetchUserOrder.() (package:flutter_sample/service/TestAsync.dart:44:21)
I/flutter (11975): │ #1   _rootRunUnary (dart:async/zone.dart:1198:47)
I/flutter (11975): ├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
I/flutter (11975): │  TestAsync: fetchUserOrder: index = 1 then_value = Lat: 37.4219983, Long: -122.084
I/flutter (11975): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
I/flutter (11975): ┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
I/flutter (11975): │ #0   TestAsync.fetchUserOrder.() (package:flutter_sample/service/TestAsync.dart:44:21)
I/flutter (11975): │ #1   _rootRunUnary (dart:async/zone.dart:1198:47)
I/flutter (11975): ├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
I/flutter (11975): │  TestAsync: fetchUserOrder: index = 0 then_value = Lat: 37.4219983, Long: -122.084
I/flutter (11975): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
I/flutter (11975): ┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
I/flutter (11975): │ #0   TestAsync.fetchUserOrder.() (package:flutter_sample/service/TestAsync.dart:44:21)
I/flutter (11975): │ #1   _rootRunUnary (dart:async/zone.dart:1198:47)
I/flutter (11975): ├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
I/flutter (11975): │  TestAsync: fetchUserOrder: index = 3 then_value = Lat: 37.4219983, Long: -122.084

如您所见,AFTER_WAIT您的订单是在之前的 print

代码语言:javascript
复制
TestAsync: fetchUserOrder: index =

为什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-22 16:57:06

您必须在“未来”中添加await,在跳到下一行之前,您希望它先完成任何操作

票数 1
EN

Stack Overflow用户

发布于 2020-07-22 17:04:17

我找到了解决办法:

代码语言:javascript
复制
 Future<String> createOrderMessage() async {
    _logger.d("TestAsync: createOrderMessage: BEFORE_WAIT ");
    // The "await" keyword only works within an async function.
    var order = await fetchUserOrder();
    // The next line will execute only after finish fetchUserOrder() because use "await and async".
    return 'TestAsync: createOrderMessage: AFTER_WAIT Your order is: $order';
  }

  Future<Position> fetchUserOrder() async {
    _logger.d("TestAsync: fetchUserOrder: START");
    for (int index = 0; index < 10; index++) {
      await Geolocator()
          .getCurrentPosition(desiredAccuracy: LocationAccuracy.high)
          .then((value) {
        _logger
            .d("TestAsync: fetchUserOrder: index = $index then_value = $value");
      });
    }
  }

这种帮助:

代码语言:javascript
复制
await Geolocator()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63039352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档