Future.value
与Future.microtask
之间有何区别
案例1:
Future.microtask(() => 1).then(print);
Future.microtask(() => Future(() => 2)).then(print);
Future.value(3).then(print);
Future.value(Future(() => 4)).then(print);
其输出为:
1
3
4
2
案例2:当我交换语句时
Future.value(3).then(print);
Future.value(Future(() => 4)).then(print);
Future.microtask(() => 1).then(print);
Future.microtask(() => Future(() => 2)).then(print);
输出为:
3
1
4
2
问题:
Future.value
与Future.microtask
有什么区别?
1.哪一个更优先?Future.value
还是Future.microtask
先完成?
1.为什么最终输出(4
和2
)的顺序保持不变?
有人能解释一下事件和微任务队列的这种行为吗?
1条答案
按热度按时间ryevplcw1#
Future.microtask
调度一个微任务来执行参数函数,然后用该函数调用的结果来完成将来的任务。Future()
和Future.delayed
调度一个定时器任务,前者与Duration.zero
一起执行一个函数,并利用该函数调用的结果完成将来的任务。Future.value
接受一个 * value *,而不是一个函数来调用。如果你使用Future.value(computation())
,计算会立即执行(或者至少是 * started *,如果是异步的话)。如果执行
Future.microtask(computation)
,计算将在后面的微任务中 * 启动 *。在每种情况下,如果函数返回一个future,或者传递给
Future.value
的值是一个future,那么在Future
构造函数返回的future以相同的结果完成之前,您还必须等待future完成。举个具体的例子:
这将创建一个future,其值为
3
,但是,由于future * 承诺 * 不会在调用then
时立即调用回调,如then(print)
,因此它会调度一个微任务,以便在以后的某个时间实际调用print
回调,因此,您会得到额外的延迟。更详细地说:
这是立即发生的事情,然后事件/微任务循环接管。
() => 1
到值1。Future(() => 2)
。Future(...)
)和持续时间为零的计时器T2。() => 4
评估为4。() => 2
,并以值2完成F6。因此,三个微任务、两个计时器和一些未来的结果传播之后,您将得到所看到的结果。
第二个例子可以用同样的方法完成:
只有微任务的3和1应该按顺序先打印,然后打印4,再打印2,因为2-timer被安排在4-timer之后。3 - 1 - 4 - 2,这就是你看到的。