如何在Javascript中实现一个UML同步条?

How to implement a UML synchronisation bar in Javascript?

因此,Javascript 异步处理得非常好,因为它可以传递一个事件处理函数,例如取自此 example

的代码
connection.query('SELECT 1 + 1 AS solution', function (error, results, fields) {
  if (error) throw error;
  console.log('The solution is: ', results[0].solution);
});

而且我想知道,如果有人将一个代码分解为异步块,有时您会希望所有线程都等待 regroup/gather,在 UML 中,我认为这是一个 Synchronisation Bar(图 2 和 3 中的粗黑实心水平矩形)

我想知道这在 Javascript 中看起来如何。在 Windows 代码中,可以设置 Mutex 和 Semaphore 等

那么,请问如何在Javascript中实现一个UML同步栏?

正如您所指出的,JavaScript 是单线程的,因此不需要像 Mutexes 和 Semaphores 这样的多线程同步原语。一种思考方式是有一个隐式的单一全局互斥量,每个异步回调在进入时获取该互斥量。或者用简单的英语来说:只有一个函数同时执行。

因此,您要做的是实现与信号量类似的簿记,使用普通变量,例如计算未完成异步请求数的全局变量。根据您的代码,您可以让每个回调检查它是否是最后一个,如果是,则触发继续;或者您可以定期轮询计数器(这样不太优雅)。

大致:

var g_semaphore = 0;

function GetCallback(i) {
  return function() {
    console.log("callback #" + i + " coming back");
    /* ... do stuff ... */
    g_semaphore--;
    CheckSyncBar();
  };
}

for (var i = 0; i < 5; i++) {
  console.log("requesting callback #" + i);
  g_semaphore++;
  window.setTimeout(GetCallback(i), Math.random() * 5000);
}

function CheckSyncBar() {
  if (g_semaphore > 0) return;
  window.setTimeout(Continuation, 0);
}

function Continuation() {
  console.log("all callbacks are done, continuing");
  /* ... do stuff ... */
}