您不知道JS书中的这段代码?

问题描述 投票:1回答:2

我无法理解该代码段中用于解释异步部分中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()周围的如果条件是一个,应在ab具有值后打开一次,我无法理解那部分是我遗漏的东西吗,如果a或b没有值baz不会被调用,并且函数不应等待a和b都具有值,是否存在该代码有任何解释吗?

javascript
2个回答
2
投票

如果a或b没有值,则不会调用baz,并且该函数不应等待a和b都具有值

确实-如果foobar之前运行,则(a && b)将求值为(x * 2 && undefined),因此baz将不运行在此]调用foo

但是在那之后,定义了全局变量a is

,因此一旦bar运行after,则bar将分配给b,并且if条件将完成,然后将调用baz

foobar不会wait

定义要定义的值-而是if在运行时定义所有必需的值,然后调用baz。因此,如果两个ajax调用均成功,则最终的ajax调用将导致无论如何都调用baz。 (只要x * 2y * 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();
  });

2
投票

的确,在凯尔·辛普森(Kyle Simpson)的书中,此特定代码不必要地造成混淆。

© www.soinside.com 2019 - 2024. All rights reserved.