...更新
即使没有异步加载文件操作,它仍然无法根据您的解释运行我期望它...例如
... 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,是否应该完全编译并记录加载的文本,然后才能进行记录并加载'?
答案 0 :(得分:1)
您所看到的正是预期的结果。以下是事件序列:
requirejs([ 'part1'],
告诉RequireJS启动part1
的加载。装载将在未来一段时间内完成。
RequireJS获取part1
的代码并执行它。它找到一个匿名define
,RequireJS将其解释为part1
的定义,因此它执行传递给define
的回调。
执行第fs.readFile
行。这会启动读取文件。该操作将在未来一段时间内完成。 这是异步的。
传递给define
的回调的执行继续并完成。如果您在console.log
之后有fs.readFile
语句,那么在文件内容之前,您会看到的输出。
由于执行了传递给define
的回调,因此RequireJS可以调用传递给requirejs([ 'part1'],
的回调。 没有理由将其延迟。特别是fs.readFile
操作与此无关。
最终会读取文件并调用传递给fs.readFile
的回调。
如果您使用fs.readFileSync
,那么您将获得您期望的行为。
附注:在代码中使用this.text
可能没有按照您的想法进行操作。在您的代码中this === global
。