Skip to content
This repository has been archived by the owner on Apr 22, 2023. It is now read-only.

Commit

Permalink
Fix #1694 Document require() cycles
Browse files Browse the repository at this point in the history
  • Loading branch information
isaacs committed Sep 13, 2011
1 parent cb6b9eb commit dc8f4ee
Showing 1 changed file with 54 additions and 0 deletions.
54 changes: 54 additions & 0 deletions doc/api/modules.markdown
Expand Up @@ -30,6 +30,60 @@ Variables
local to the module will be private. In this example the variable `PI` is
private to `circle.js`.

### Cycles

When there are circular `require()` calls, a module might not be
done being executed when it is returned.

Consider this situation:

`a.js`:

console.log('a starting');
exports.done = false;
var b = require('./b.js');
console.log('in a, b.done = %j', b.done);
exports.done = true;
console.log('a done');

`b.js`:

console.log('b starting');
exports.done = false;
var a = require('./a.js');
console.log('in b, a.done = %j', a.done);
exports.done = true;
console.log('b done');

`main.js`:

console.log('main starting');
var a = require('./a.js');
var b = require('./b.js');
console.log('in main, a.done=%j, b.done=%j', a.done, b.done);

When `main.js` loads `a.js`, then `a.js` in turn loads `b.js`. At that
point, `b.js` tries to load `a.js`. In order to prevent an infinite
loop an **unfinished copy** of the `a.js` exports object is returned to the
`b.js` module. `b.js` then finishes loading, and its exports object is
provided to the `a.js` module.

By the time `main.js` has loaded both modules, they're both finished.
The output of this program would thus be:

$ node main.js
main starting
a starting
b starting
in b, a.done = false
b done
in a, b.done = true
a done
in main, a.done=true, b.done=true

If you have cyclic module dependencies in your program, make sure to
plan accordingly.

### Core Modules

Node has several modules compiled into the binary. These modules are
Expand Down

0 comments on commit dc8f4ee

Please sign in to comment.