NodeJS回调和返回值混淆

时间:2016-06-08 19:07:32

标签: node.js callback return

我需要找到一种方法,在我的主代码块中返回一个字符串以进行摘要,以及一旦返回digest的值,就会在我的主代码块中开始处理代码中的其余代码。

请帮助!

这是我当前的代码不起作用。

var digest = checkIntegrity(filePath, res[3]);
//digest always come back undefined and never matches res[2] so file always deletes

if (digest === 0){
    console.log('File Inaccessible');
} else {
    if (digest === res[2]){
        createNewFile();
    } else {
        console.log('File hash doesn't match');
        delBadFile();
    }
}

function checkIntegrity(filePath, algorithm, cb){
    console.log('in checkIntegrity');
    var hash = crypto.createHash(algorithm);
    var digest;

    //see if file is there
    fs.stat(filePath, function(fileErr, fileStats){
        if(fileErr){
            //error accessing file, most likely file does not exist
            return 0;
        } else {
            //file exists
            var fileIn = fs.createReadStream(filePath);
            fileIn.on('data', function(chunk){
                if (chunk) {
                    hash.update(chunk);
                }
            });

            fileIn.on('end', function(){
                return hash.digest('hex');
            });
        }
    });
}

1 个答案:

答案 0 :(得分:2)

checkIntegrity函数是异步的,即它接受回调。您希望作为该函数的结果传递的任何值都应作为参数传递给该回调函数。您的示例中发生的事情是checkIntegrity正在调用fs.stat(这也是异步的),然后直接返回undefined - 在fs.stat有机会完成之前。< / p>

您可以选择:

  1. 将来电从fs.stat更改为fs.statSync。这是stat函数的同步版本。
  2. 更改代码以正确使用回调:

    checkIntegrity(filePath, res[3], function (err, digest) { 
        if (err) return console.error(err);
    
        if (digest === 0) {
            console.log('File Inaccessible');
        } else {
            if (digest === res[2]){
                createNewFile();
            } else {
                console.log('File hash doesn\'t match');
                delBadFile();
            }
        }
    });
    
    function checkIntegrity(filePath, algorithm, cb){
        console.log('in checkIntegrity');
        var hash = crypto.createHash(algorithm);
        var digest;
    
        //see if file is there
        fs.stat(filePath, function(fileErr, fileStats) {
            if(fileErr){
                 //error accessing file, most likely file does not exist
                return cb(fileErr);
            } else {
                //file exists
                var fileIn = fs.createReadStream(filePath);
                fileIn.on('data', function(chunk){
                    if (chunk) {
                        hash.update(chunk);
                    }
                });
    
                fileIn.on('end', function() {
                    cb(null, hash.digest('hes'));
                });
            }
        });
    }
    
  3. 在我看来,异步代码和回调是Node.js的一个基本部分。我鼓励你选择2。这绝对值得学习。有数百个网站,如callbackhell.com,可以更好地解释回调。