我无法理解该代码段中用于解释异步部分中javascript进程并发性的那部分,即代码段:
var a, b;
function foo(x) {
a = x * 2;
if (a && b) {
baz();
}
}
function bar(y) {
b = y * 2;
if (a && b) {
baz();
}
}
function baz() {
console.log( a + b );
}
// ajax(..) is some arbitrary Ajax function given by a library
ajax( "http://some.url.1", foo );
ajax( "http://some.url.2", bar );
凯尔说,baz()周围的如果条件是一个门,应在a和b具有值后打开一次,我无法理解那部分是我遗漏的东西吗,如果a或b没有值baz不会被调用,并且函数不应等待a和b都具有值,是否存在该代码有任何解释吗?
如果a或b没有值,则不会调用baz,并且该函数不应等待a和b都具有值
确实-如果foo
在bar
之前运行,则(a && b)
将求值为(x * 2 && undefined)
,因此baz
将不运行在此]调用foo
。
但是在那之后,定义了全局变量a
is
bar
运行after,则bar
将分配给b
,并且if
条件将完成,然后将调用baz
。foo
和bar
不会wait
baz
。因此,如果两个ajax调用均成功,则最终的ajax调用将导致无论如何都调用baz
。 (只要x * 2
和y * 2
不为假)任一:
foo
运行,条件失败。然后bar
运行,条件成功,调用baz
。或bar
运行,条件失败。然后foo
运行,条件成功,baz
称为这仍然是一种非常优雅的处理方式。如果您使用Promise.all
,则逻辑将更加清晰,而无需重新分配全局变量和检查条件:
const doFetch = url => fetch(url).then(res => res.text());
Promise.all([
doFetch('http://some.url.1'),
doFetch('http://some.url.2')
])
.then(([x, y]) => {
// do stuff with x and y, if needed
baz();
});
的确,在凯尔·辛普森(Kyle Simpson)的书中,此特定代码不必要地造成混淆。