【发布时间】:2023-03-13 04:57:01
【问题描述】:
我无法理解 Node 在并行处理和函数调用返回值方面的操作方式。
仅供参考:下面的 gulp 函数仅作为此问题的示例而创建。
函数是否有可能在Read a large file语句完成处理之前返回流(大文件已从文件系统中完全读取并添加流),或者Node足够聪明以完成所有返回前的声明?
function moveFiles(){
var gulp = require('gulp'),
stream = require('merge-stream')();
// Read a large file
stream.add(gulp.src('src/large-file.txt')
.pipe(gulp.dest('dest/'))
);
// Read a small file
stream.add(gulp.src('src/small-file.txt')
.pipe(gulp.dest('dest/'))
);
return (stream.isEmpty() ? null : stream);
}
【问题讨论】:
-
流就是这样:指向尚未(或仅部分)读取的文件的指针。如果函数已经读取了全部内容,那么 stream 有什么用?
-
欢迎来到asynchronous programming的精彩世界!
-
@Bergi 是的,异步方面让我很困惑。这个问题与 gulp 本身无关。另一个例子可能是,使用节点:假设同一个函数从文件系统读取两个文件(不使用 gulp 或流,只是简单的节点
fs调用),然后该函数应该返回连接在一起的两个文件的内容。是否有可能在读取两个文件之前触发 return 语句? -
是的,如果您使用异步
fs方法(不是它们的同步对应方法),通常就是这种情况。而且因为它们在没有完成读取文件的情况下立即返回,您的return语句将立即得到满足,这也是您的函数还不能返回连接结果的原因。充其量,它可以返回一个代表未来结果的结构。这样的结构可以是一个承诺或一个流。借助此结构,您可以告诉节点在将来有结果时执行某项操作(执行 callback 函数)。 -
Experience, and checking the docs :-) 但是,每个 statement 都是同步评估的。它可能会启动后台任务,但它总是在完全不相关的事情发生之前返回(与多线程环境不同)。在
a(); b();中,a将始终在评估b之前返回。
标签: javascript node.js gulp