dart 异步事件执行流程分析(一)

深入研究了dart 的异步事件执行流程。
 
main() {
/// testNoAwait() and testWithCallerAwait() exe order is same.
// testNoAwait();
// testWithCallerAwait();

 

/// testWithCalleeAwait() and testBothAwait() exe order is same;
// testWithCalleeAwait();
// testBothAwait();

 

/// testAllAwait() exe order is same as the code text order;
// testAllAwait();
}

 

testNoAwait() {
print('testNoAwait start...');
runNoAwait(delayedNoAwait, 10);
runNoAwait(delayedNoAwait, 5);
runNoAwait(delayedNoAwait, 1);
print('testNoAwait completed...\n');
}

 

testWithCallerAwait() {
print('testWithCallerAwait start...');
runWithAwait(delayedNoAwait, 10);
runWithAwait(delayedNoAwait, 5);
runWithAwait(delayedNoAwait, 1);
print('testWithCallerAwait completed...\n');
}

 

testWithCalleeAwait() {
print('testWithCalleeAwait start...');
runNoAwait(delayedWithAwait, 10);
runNoAwait(delayedWithAwait, 5);
runNoAwait(delayedWithAwait, 1);
print('testWithCalleeAwait completed...\n');
}

 

testBothAwait() {
print('testBothAwait start...');
runWithAwait(delayedWithAwait, 10);
runWithAwait(delayedWithAwait, 5);
runWithAwait(delayedWithAwait, 1);
print('testBothAwait completed...\n');
}

 

testAllAwait() async {
print('testAllAwait start...');
await runWithAwait(delayedWithAwait, 10);
await runWithAwait(delayedWithAwait, 5);
await runWithAwait(delayedWithAwait, 1);
print('testAllAwait completed...\n');
}

 

void runNoAwait(void delayed(int s), int seconds) {
delayed(seconds);
}

 

void runWithAwait(void delayed(int s), int seconds) async {
await delayed(seconds);
}

 

void delayedNoAwait(int s) {
print('delayedNoAwait $s start ---');
Future.delayed(
Duration(seconds: s), () => print('delayedNoAwait $s task start...'))
  .then((_) => print('delayedNoAwait $s task completed.'));
print('delayedNoAwait $s completed ---\n');
}

 

void delayedWithAwait(int s) async {
print('delayedWithAwait $s start ---');
await Future.delayed(Duration(seconds: s),
() => print('delayedWithAwait $s task start...'))
  .then((_) => print('delayedWithAwait $s task completed.'));
print('delayedWithAwait $s completed ---\n');
}
 

将 main() 中的注释逐行去掉,output 如下:

testNoAwait start...
delayedNoAwait 10 start ---
delayedNoAwait 10 completed ---

delayedNoAwait 5 start ---
delayedNoAwait 5 completed ---

delayedNoAwait 1 start ---
delayedNoAwait 1 completed ---

testNoAwait completed...

delayedNoAwait 1 task start...
delayedNoAwait 1 task completed.
delayedNoAwait 5 task start...
delayedNoAwait 5 task completed.
delayedNoAwait 10 task start...
delayedNoAwait 10 task completed.
Exited

testWithCallerAwait start...
delayedNoAwait 10 start ---
delayedNoAwait 10 completed ---

delayedNoAwait 5 start ---
delayedNoAwait 5 completed ---

delayedNoAwait 1 start ---
delayedNoAwait 1 completed ---

testWithCallerAwait completed...

delayedNoAwait 1 task start...
delayedNoAwait 1 task completed.
delayedNoAwait 5 task start...
delayedNoAwait 5 task completed.
delayedNoAwait 10 task start...
delayedNoAwait 10 task completed.
Exited

testWithCalleeAwait start...
delayedWithAwait 10 start ---
delayedWithAwait 5 start ---
delayedWithAwait 1 start ---
testWithCalleeAwait completed...

delayedWithAwait 1 task start...
delayedWithAwait 1 task completed.
delayedWithAwait 1 completed ---

delayedWithAwait 5 task start...
delayedWithAwait 5 task completed.
delayedWithAwait 5 completed ---

delayedWithAwait 10 task start...
delayedWithAwait 10 task completed.
delayedWithAwait 10 completed ---

Exited

testBothAwait start...
delayedWithAwait 10 start ---
delayedWithAwait 5 start ---
delayedWithAwait 1 start ---
testBothAwait completed...

delayedWithAwait 1 task start...
delayedWithAwait 1 task completed.
delayedWithAwait 1 completed ---

delayedWithAwait 5 task start...
delayedWithAwait 5 task completed.
delayedWithAwait 5 completed ---

delayedWithAwait 10 task start...
delayedWithAwait 10 task completed.
delayedWithAwait 10 completed ---

Exited

testAllAwait start...
delayedWithAwait 10 start ---
delayedWithAwait 10 task start...
delayedWithAwait 10 task completed.
delayedWithAwait 10 completed ---

delayedWithAwait 5 start ---
delayedWithAwait 5 task start...
delayedWithAwait 5 task completed.
delayedWithAwait 5 completed ---

delayedWithAwait 1 start ---
delayedWithAwait 1 task start...
delayedWithAwait 1 task completed.
delayedWithAwait 1 completed ---

testAllAwait completed...

Exited

 


 

通过仔细分析发现,异步执行虽然是个好东西,但当异步调用链过长时,如果不仔细检查代码,代码的执行顺序将很难预测正确。
 

转载于:https://www.cnblogs.com/pacific/p/10159485.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值