在诸如JavaScript的单线程环境中,“竞赛条件”的正确术语是什么?

时间:2018-06-20 15:43:38

标签: javascript

首先,我不是要求另一个“ JavaScript是否具有竞争条件”的讨论。

我的问题:在JavaScript中,两个非顺序函数可以访问同一变量。示例:

var a = 10;
var b = 0;

setTimeout(
  function() { a = 5; },
  Math.random() * 1000
);

setTimeout(
  function() { b = a; },
  Math.random() * 1000
);

setTimeout(
  function() { console.log(b); },
  2000
);

现在,许多人坚持认为这不是竞赛条件,因为操作是原子的。同时,我还没有找到可以解释这种错误/状况 的人,除了一位同事称其为“基于时间的变量处理错误”(包括在对话中相当长的时间,尤其是如果您不得不讲数十遍以解释某些内容时。

这尤其令人沮丧,因为每当我开始解释“这是一个竞争条件”的问题时,我都会立即被无益的“ JavaScript中没有竞争条件”打断。

有人可以告诉我“正确”一词是什么吗?

编辑:是的,该示例已大大简化。真正的案例包括HTTP请求,promise和AngularJS渲染周期以我什至不甚了解的方式进行干扰,以至于无法将其作为示例。随机超时可以用来模拟发生的情况。再次,关于代码质量的讨论确实无法帮助我解决沟通问题。

1 个答案:

答案 0 :(得分:1)

您的术语是正确的。

这不是进程或线程的竞赛,它不是任务完成的竞赛。实际上,您可以在多线程环境中执行相同的操作,而不必在乎哪个线程先到达同一代码,而是先完成哪个任务。

Bluebird或Async等著名的库都将其称为.race()

http://bluebirdjs.com/docs/api/promise.race.html

https://caolan.github.io/async/race.js.html


换句话说-如果这两个家伙称其为Race,我想你可以:https://github.com/caolan https://github.com/petkaantonov