1

我正在尝试实现以下用例:

  1. 我有一系列同步任务
  2. 每个同步任务都需要触发一个异步任务
  3. 异步任务不能同时运行,因此每个任务都等待其触发器 (2) 和其前任的完成。

在此处输入图像描述

我的第一个想法是将每个任务(同步和异步)转换为一个承诺,然后创建两个承诺链。但是我正在努力寻找一种方法来实现具有双重依赖的异步任务链。

我怎样才能做到这一点?

4

3 回答 3

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…)

于 2016-04-07T00:11:49.440 回答
0

你只需要一个承诺链:

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 );
...
于 2016-04-06T21:33:23.333 回答
0

从图中可以看出,Async2 和 3 不仅仅依赖于相关 Sync 函数的完整实现,

使用您的命名约定,这就是我链接承诺的方式:

               Synctask1
               |       |
             Sync2    Async1
             |     \     |
           Sync3    Async2(resolved with promiseAll[Async1, Sync2]
                \     |
                 \    |
                 Async3(resolved with promiseAll[Async2, Sync3]
于 2016-04-06T22:03:52.840 回答