【问题标题】:Using Futures with Dart在 Dart 中使用 Future
【发布时间】:2016-07-28 01:19:31
【问题描述】:

为什么打印结果一直返回“asd”?

      var jerl = "asd";

  HttpRequest.request('Foo',
    method: "GET",
    requestHeaders: {"Authorization": "Secret"}).then((x) => x.responseText).then((y) => jerl = y);

  print(jerl);

【问题讨论】:

  • 这看起来不像 angularjs 代码......
  • 一定是下意识加的

标签: dart


【解决方案1】:

异步代码只是计划稍后执行,同步代码继续执行而不等待异步代码。您传递给Future.then(...) 的方法在计划的异步代码完成时执行。您可以在 StackOverflow 上找到很多标记为 [:dart-async:] 的此类问题和示例。

如果您希望在异步代码完成时执行代码,您需要像使用其他代码一样将其与 then 链接起来

var jerl = "asd";

HttpRequest.request('Foo',
  method: "GET",
  /* return */ requestHeaders: {"Authorization": "Secret"})
  .then((response) {
    var jer1 = x.responseText;
    print(jerl);
  });

您可以使用async/await 功能使代码看起来更像同步代码

Future someMethod() async { // <== added `Future` and `async`
  var jerl = "asd";

  var response = await HttpRequest.request('Foo',  // <== added `await`
    method: "GET",
    requestHeaders: {"Authorization": "Secret"}).then((x) => 
  print(response.text);
}

async 具有传染性。没有办法从异步执行返回到同步执行。如果您的代码调用了任何异步方法或函数,并且您需要更进一步的代码来等待异步结果,那么您需要使用.then 链接所有以下代码(也在调用方法中)(或使用async/await )。为此,您还需要向调用者发送return 未来,以便他可以调用.then()

使用async/await,您无需显式返回未来。

async/await 不会使异步代码同步(如上所述),它只会使其看起来更像同步代码。基本行为与then 相同。

【讨论】:

    猜你喜欢
    • 2014-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    相关资源
    最近更新 更多