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

时间:2015-06-24 10:54:03

标签: javascript node.js requirejs

...更新

即使没有异步加载文件操作,它仍然无法根据您的解释运行我期望它...例如

... 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的理解是它允许我在继续线程之前指定要加载的模块,允许我在需要时阻塞。我以前使用它的方式就是这样的。但是,当我将它与节点一起使用时,它的这方面不再有效。显然我知道节点是非阻塞的,这就是为什么要求不像我期望的那样运行的原因。 例如......

的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,是否应该完全编译并记录加载的文本,然后才能进行记录并加载'?

1 个答案:

答案 0 :(得分:1)

您所看到的正是预期的结果。以下是事件序列:

  1. requirejs([ 'part1'],告诉RequireJS启动part1的加载。装载将在未来一段时间内完成。

  2. RequireJS获取part1的代码并执行它。它找到一个匿名define,RequireJS将其解释为part1的定义,因此它执行传递给define的回调。

  3. 执行第fs.readFile行。这会启动读取文件。该操作将在未来一段时间内完成。 这是异步的。

  4. 传递给define的回调的执行继续并完成。如果您在console.log之后有fs.readFile语句,那么在文件内容之前,您会看到的输出。

  5. 由于执行了传递给define的回调,因此RequireJS可以调用传递给requirejs([ 'part1'],的回调。 没有理由将其延迟。特别是fs.readFile操作与此无关。

  6. 最终会读取文件并调用传递给fs.readFile的回调。

  7. 如果您使用fs.readFileSync,那么您将获得您期望的行为。

    附注:在代码中使用this.text可能没有按照您的想法进行操作。在您的代码中this === global