使用Dart期货

时间:2016-07-28 01:19:32

标签: dart

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

      var jerl = "asd";

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

  print(jerl);

1 个答案:

答案 0 :(得分:7)

异步代码只是安排在以后执行,同步代码继续执行而不等待异步代码。传递给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相同。