Dart如何看待级联期货?
假设我有这门课:Dart如何看待级联期货?,dart,Dart,假设我有这门课: void main()异步{ 最后一个示例=ExampleClass(); 等待示例。waitOne(); 等待示例。waitOne(); 打印(“完成”); } 类示例类{ Future waitOne()异步{ 等待未来。延迟(持续时间(秒:1)); 打印(“1秒”); } } 这段代码完全符合我的预期。其输出如下: 1 second 1 second finished 那么我们有这个代码: void main()异步{ 最后一个示例=ExampleClass(); 以
void main()异步{
最后一个示例=ExampleClass();
等待示例。waitOne();
等待示例。waitOne();
打印(“完成”);
}
类示例类{
Future waitOne()异步{
等待未来。延迟(持续时间(秒:1));
打印(“1秒”);
}
}
这段代码完全符合我的预期。其输出如下:
1 second
1 second
finished
那么我们有这个代码:
void main()异步{
最后一个示例=ExampleClass();
以身作则
…waitOne()
…waitOne();
打印(“完成”);
}
此代码现在具有级联运算符(..),并且输出看起来很奇怪:
finished
1 second
1 second
代码跳过两个Future并首先将“finished”打印到控制台,然后同时将“1秒”打印两次(就像Future#wait一样)
为什么Dart会以这种方式工作?在您的示例中,使用级联运算符添加
await
不会执行任何操作,因为级联运算不会返回任何内容,因此没有等待的未来,然后立即打印完成的请记住,级联运算符的结果是原始的您在其上使用它的对象。也就是说,对于var result=object..x()…y()…z()
,result
将被分配object
的值,而不管x
,y
或z
返回什么。忽略由x()
、y()
和z()
返回的值。这相当于:
object.x();
object.y();
object.z();
var结果=对象;
您的案例涉及未来
s,与此相同:
final example=ExampleClass();
以身作则
…waitOne()
…waitOne();
因此,您正在执行以下等效操作:
final example=ExampleClass();
示例.waitOne();//返回的未来被忽略。
示例.waitOne();//返回的未来被忽略。
等待示例;//错误地使用非未来的等待。
(请注意,启用s和s线头会发现此错误。)
要正确等待,您不能使用cascade操作符,需要显式地等待各个操作。另请参阅本期文章,其中讨论了可能对语言进行的更改,以支持对成员或级联运算符使用wait