假设这是linux shell,我要做的是:

copy file1 tmp
rename tmp file2

我会做瀑布
function copyFile(cb) {
    child_process.exec('cp file1 tmp', function (error, stdout, stderr) {
        ......
    });
}
async.waterfall([
    copyFile,
    renameFile
], function (error) {
    if (error) {
        //handle readFile error or processFile error here
    }
});

或者我可以
child_process.execSync('cp file1 tmp");
child_process.execSync('rename tmp file2');

请问有什么区别?例如表演?舞台调度?
非常感谢!

最佳答案

这里的主要区别是execSync是阻塞的,exec是非阻塞的。execSync阻止创建进程,直到使用execSync创建的子进程返回。exec立即返回值,如果以后有值,则返回值,并且不会阻止创建父进程。否则,它们在阻塞之外的行为是相同的。
async.waterfall是一种控制流机制,它只保证按顺序执行操作,并将值从链中的第一个函数返回到链中的最后一个函数。如果传递给async.waterfall的某个函数包含将被阻塞的代码,则async.waterfall也将被阻塞。async.waterfall不能保证它内部执行的所有代码都是异步的。
使用child_process意味着这将在单独的进程上执行,而不是在使用node执行的主进程上执行。不应该对控制流使用child_process,因为创建和销毁新的子进程会产生开销。除非您正在执行一些CPU密集型任务或需要单独的进程,否则应该避免这种情况。
如果您想同步执行,您可以将所有代码包装在一个try/catch块中,但我肯定会说不要对控制流使用child_process
从性能的角度来看,这两种方法在创建子进程时都不好,但是,exec()会更好,因为它至少会立即返回到创建进程,从而允许其他代码继续执行。无论何时在node中使用阻塞代码,都会消除使用node的主要好处。有些情况下需要阻塞,比如需要模块,但是在大多数情况下有一个非阻塞的替代方案。
另外,如果您试图复制一个文件,可以使用fs模块,并将原始文件用新名称导入新目标中的新文件。下面的方法是异步的,不需要任何外部依赖项或控制流库。此外,它的性能应该比上面实现的任何代码都要高。

var fs = require('fs');

function copy (src, dest, callback) {
    var r = fs.createReadStream(src);
    var w = fs.createWriteStream(dest);

    r.pipe(w);

    r.on('error', function() {
        return callback(err);
    });

    r.once('end', function() {
        return callback();
    });
}

08-26 15:20