首先,我不是要求另一个“ 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渲染周期以我什至不甚了解的方式进行干扰,以至于无法将其作为示例。随机超时可以用来模拟发生的情况。再次,关于代码质量的讨论确实无法帮助我解决沟通问题。
答案 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