为什么节点上的requirejs在继续之前没有加载指定的require

更新中…

即使没有asynchronous加载文件操作,它仍然不会运行我期望它根据您的解释…例如

part0_start.js …

var requirejs = require('requirejs'); requirejs.config({ nodeRequire : require }); requirejs([ 'part1_setup'], function( part1_setup ) {//this callback executes when part1_setup has been compiled and run console.log( 'part1_setup callback called') }) 

part1_setup.js …

 requirejs( [ 'stopwatchObject' ], function( stopwatch ) {//run the callback function when stopwatchObject is loaded... console.log( 'stopwatch object compiled' ); }) 

stopwatchObject.js …

 define ( [], function() {//this anonymous function happens straight away, go straight to the callback function on line below... console.log( "stopwatch object"); }) 

我期望这个输出

 stopwatch object stopwatch object compiled part1_setup callback called 

但它实际上输出…

 part1_setup callback called stopwatch object stopwatch object compiled 

还是我忽略了一些明显的东西? 再次感谢您的反馈。


我对requirejs的理解是它允许我在继续线程之前指定要加载的模块,这样我就可以阻塞了。 当我以前使用过它时,它已经以这种方式工作了。 但是,当我将它与节点一起使用时,它的这个方面不再起作用。 显然我知道节点是非阻塞的,这就是为什么require不能像我期望的那样工作的原因。 例如…

的test.txt

 test text test text test text test text test text test text test text 

start.js

 var requirejs = require('requirejs'); requirejs.config({ nodeRequire : require }); requirejs([ 'part1'], function( part1 ) { console.log( 'loaded' ) }) 

part1.js

 define([], function() { var fs = require('fs'), filename = 'test.txt'; fs.readFile(filename, 'utf8', function(err, data) { if (err) throw err; this.text = data; console.log( this.text ); }) 

})

按以下顺序输出…

 module loaded test text test text test text test text test text test text test text 

但是,如果我指定需要part1.js,它应该不完全编译这个并logging加载的文本之前进入日志“加载”?

你所看到的正是预期的。 以下是事件的顺序:

  1. requirejs([ 'part1'],告诉RequireJS启动part1的加载,将来会加载一段时间。

  2. RequireJS获取part1的代码并执行它。 它find一个匿名define ,RequireJS define其解释为part1的定义,从而执行传递给define的callbackpart1

  3. 执行fs.readFile行。 这启动了读取文件。 这项行动将在未来一段时间完成。 这是asynchronous的。

  4. 传递给define的callback的执行继续并完成。 如果你在fs.readFile之后有一个console.log语句,你会在文件的内容之前看到它的输出。

  5. 由于传递给define的callback的执行完成了,RequireJS就可以调用传递给requirejs([ 'part1'],的callback函数了,没有理由必须延迟,特别是fs.readFile操作没有方向就此。

  6. 该文件最终被读取,并传递给fs.readFile的callback被调用。

如果你使用fs.readFileSync那么你会得到你期望的行为。

附注:在你的代码中使用this.text可能不会做你认为正在做的事情。 在你的代码this === global