【问题标题】:Strange async behaviour奇怪的异步行为
【发布时间】:2015-07-21 10:00:10
【问题描述】:

我试图了解 Dart 如何执行异步调用。

给定以下代码:

main() {
  test("test", () async{
    await myCall( );
    print( "done");
  });
}

Future myCall( ) async{

  ["0","1","2"].forEach( (item) async{
    print( "about to callback");
    await futurePrint( item);
    print( "done  callback");
  });
  print( "done mycall");
  return new Future.value();
}

Future futurePrint( String str){
  print( "string = ${str}");
  return new Future.value();
}

我希望输出是

about to future print 
string = 0 
done future print 
about to future print 
string = 1
done future print 
about to future print 
string = 2 
done future print 
done mycall
done 

但代码实际输出的是

print( "done mycall");
about to future print
string = 0
about to future print
string = 1
about to future print
string = 2
done
done future print
done future print
done future print

为什么“done myCall”出现在打印的第一行,而不是最后一行? 为什么在“完成”打印之后会出现“完成的未来打印”?

如何让myCall 仅在数组迭代完成时返回?

【问题讨论】:

  • 也可以使用await Future.wait(["0", "1", "2"].map((..) async => ...))对每个元素进行异步操作,然后等待所有结果。

标签: dart dart-async


【解决方案1】:

["0","1","2"].forEach(<callback>) 不等待<callback> 返回的期货。

如果你这样做

Future myCall( ) async {

  for(item in ["0","1","2"]){
    print( "about to callback");
    await futurePrint( item);
    print( "done  callback");
  });
  print( "done mycall");
  return new Future.value();
}

它应该符合你的预期。

【讨论】:

  • 为什么我需要使用那个特定的迭代器?为什么我不能使用闭包迭代器?
  • 正如我的回答中提到的,forEach()(您将闭包传递给的地方)不会等待您的闭包完成,实际上它不会对返回的值做任何事情。这是火,然后忘记。因此,如果异步执行在闭包内开始,则不会保留执行顺序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-17
  • 2015-12-29
  • 1970-01-01
  • 2020-07-28
  • 2017-05-13
  • 2017-09-13
  • 2018-07-18
相关资源
最近更新 更多