循环

当循环调用 require() 时,模块可能在未完成执行时被返回。

考虑这样一种情况:

a.js

  1. console.log('a starting');
  2. exports.done = false;
  3. const b = require('./b.js');
  4. console.log('in a, b.done = %j', b.done);
  5. exports.done = true;
  6. console.log('a done');

b.js

  1. console.log('b starting');
  2. exports.done = false;
  3. const a = require('./a.js');
  4. console.log('in b, a.done = %j', a.done);
  5. exports.done = true;
  6. console.log('b done');

main.js

  1. console.log('main starting');
  2. const a = require('./a.js');
  3. const b = require('./b.js');
  4. console.log('in main, a.done=%j, b.done=%j', a.done, b.done);

main.js 加载 a.js 时,a.js 反向加载 b.js。那时,b.js 会尝试去加载 a.js。为了防止无限的循环,a.js 会返回一个 exports 对象的 未完成副本b.js 模块。之后 b.js 完成加载,并将 exports 对象返回给 a.js 模块。

main.js 加载这两个模块时,它们都已经完成加载了。因此,该程序的输出将会是:

  1. $ node main.js
  2. main starting
  3. a starting
  4. b starting
  5. in b, a.done = false
  6. b done
  7. in a, b.done = true
  8. a done
  9. in main, a.done=true, b.done=true

如果你的程序里有循环的依赖模块,请确保它们按计划执行。