我正在尝试实现以下用例:
- 我有一系列同步任务
- 每个同步任务都需要触发一个异步任务
- 异步任务不能同时运行,因此每个任务都等待其触发器 (2) 和其前任的完成。
我的第一个想法是将每个任务(同步和异步)转换为一个承诺,然后创建两个承诺链。但是我正在努力寻找一种方法来实现具有双重依赖的异步任务链。
我怎样才能做到这一点?
我正在尝试实现以下用例:
我的第一个想法是将每个任务(同步和异步)转换为一个承诺,然后创建两个承诺链。但是我正在努力寻找一种方法来实现具有双重依赖的异步任务链。
我怎样才能做到这一点?
实际上,如果您的“同步任务”真的是同步的,您可以简单地在启动异步任务链之前同步运行它们,并且每个“异步任务”在其各自的“同步任务”满足之后运行的条件,因为所有异步任务都运行毕竟同步任务。
如果您的“同步任务”本身实际上是异步的,或者以某种方式彼此真正并行运行(我不知道 ExtendScript 的线程/并发模型),那么您应该制作每个任务(无论是“同步”还是“异步") 返回一个承诺。
然后,您可以使用以下方式构建依赖关系的链网络(非循环图)Promise.all
:
var syncResult1 = syncTask1();
var asyncResult1 = syncResult1.then(asyncTask1);
var syncResult2 = syncResult1.then(syncTask2);
var asyncResult2 = Promise.all([asyncResult1, syncResult2]).then(asyncTask2);
var syncResult3 = syncResult2.then(syncTask3);
var asyncResult3 = Promise.all([asyncResult2, syncResult3]).then(asyncTask3);
(如果你的“同步任务”不需要返回承诺,那就做吧syncResult… = syncTask…(syncResult…)
)
你只需要一个承诺链:
syncTask1();
var promise1 = asyncTask1(); // Triggers first async task
syncTask2();
var promise2 = promise1.then( asyncTask2 );
syncTask3();
var promise3 = promise2.then( asyncTask3 );
...
当然,您会希望有意义地命名您的任务和承诺。不过,这将与此行为相同,因为 JavaScript 是单线程的,并且所有同步任务都将在 asyncTask1 的承诺可以解决之前完成:
syncTask1();
var promise1 = asyncTask1(); // Triggers first async task
syncTask2();
syncTask3();
...
var promise2 = promise1.then( asyncTask2 );
var promise3 = promise2.then( asyncTask3 );
...
从图中可以看出,Async2 和 3 不仅仅依赖于相关 Sync 函数的完整实现,
使用您的命名约定,这就是我链接承诺的方式:
Synctask1
| |
Sync2 Async1
| \ |
Sync3 Async2(resolved with promiseAll[Async1, Sync2]
\ |
\ |
Async3(resolved with promiseAll[Async2, Sync3]