Javascript Node.js-在前面的代码完成后,等待process.exit()执行

Javascript Node.js-在前面的代码完成后,等待process.exit()执行,javascript,node.js,asynchronous,callback,fs,Javascript,Node.js,Asynchronous,Callback,Fs,在我的node.js应用程序中,我希望在服务器关闭时,即在cmd中完成CTRL+C操作时,将一些数据写入日志文件。问题是在文件写入完成之前调用process.exit。我尝试使用回调和jQuery$.Deferred.resolve,但没有效果:可能是因为文件写入是异步的,但我希望保持异步。 回调代码: if (process.platform === "win32"){ var rl = readLine.createInterface ({ input: proces

在我的node.js应用程序中,我希望在服务器关闭时,即在cmd中完成CTRL+C操作时,将一些数据写入日志文件。问题是在文件写入完成之前调用process.exit。我尝试使用回调和jQuery$.Deferred.resolve,但没有效果:可能是因为文件写入是异步的,但我希望保持异步。 回调代码:

if (process.platform === "win32"){
    var rl = readLine.createInterface ({
        input: process.stdin,
        output: process.stdout
    });

    rl.on ("SIGINT", function (){
        process.emit ("SIGINT");
    });

}

process.on ("SIGINT", function(){
    var stopServer = function() {
        //this happens way too early, the logger.log has not written it's data yet
        process.exit();
    };

    var logServerStop = function(callback) {
        logger.log("SERVER SHUTDOWN: ", true);
        logger.log("-----------------------------------------");
        logger.log("");
        callback();
    };
    logServerStop(stopServer);  

});
以及logger.log代码:

我还希望保持log函数的原样,这样就不必添加回调函数参数,我希望在回调代码中处理我的问题。提前谢谢

编辑1 以及logger.log的更改:


请查看对日志函数的编辑

    exports.log = function(data, addDate, callback){
        if (typeof addDate === 'undefined') { myVariable = false; }
        var now = new Date();
        var date = now.getDate() + "-" + (now.getMonth() + 1) + "-" + now.getFullYear();
        var time = now.getHours() + now.getMinutes();

        if(addDate){
            data = data + date + " " + now.toLocaleTimeString();
        }
        var buffer = new Buffer(data + '\r\n');

        fs.open(filename, 'a', function( e, id ) {
            if(e){
                console.log("Foutje: " + e);
                //execute call back here.
                if(typeof callback === 'function'){ 
                  callback(e); 
                }
            }
            else{
                fs.write( id, buffer, 0, buffer.length, null, function(err){
                    if(err) {
                        console.log(err);
                    } else {
                        console.log("De log file is aangevuld.");
                    }
                    //execute call back here.
                    if(typeof callback === 'function'){ 
                      callback(err); 
                    }
                });
            }

        });
     };
在callback中,您可以将错误作为第一个参数传递,然后在调用logger.log时,您可以按如下方式执行此操作:

process.on ("SIGINT", function(){
    logger.log("SERVER SHUTDOWN: ", true);
    logger.log("-----------------------------------------");
    logger.log("", false, function(e){
        if(e){
          //Handle error here.
        }
        process.exit();
    });
});

恐怕你的建议没有解决这个问题,请按照编辑。如果您正在编辑日志函数,您可以在编写日志文件后调用回调函数。感谢您的努力,但上述响应已经帮助我实现了同样的想法!:另外,在您的建议中,我并不希望err作为回调的参数。谢谢你!为什么要避免对日志方法使用回调函数?这是最简单的解决办法。这并不意味着您必须每次都使用它。我尝试向log方法添加回调参数,但由于某些原因,回调永远不会被调用。记录器按预期将数据写入日志文件,但process.exit从未发生。我尝试在日志方法的末尾添加一行iftypeoffn=='function'{fn;},这修复了进程的问题。退出没有发生,但文件写入没有再次发生。请显示该尝试,好吗?你到底在哪里添加了fn调用,你是如何修改你的sigint处理程序的?我用你要求查看的更改编辑了我的帖子。当然,你需要将它放在异步打开/写入回调中,否则它就等同于你以前所做的!
exports.log = function(data, addDate, callback){
    if (typeof addDate === 'undefined') { myVariable = false; }
    var now = new Date();
    var date = now.getDate() + "-" + (now.getMonth() + 1) + "-" + now.getFullYear();
    var time = now.getHours() + now.getMinutes();

    if(addDate){
        data = data + date + " " + now.toLocaleTimeString();
    }
    var buffer = new Buffer(data + '\r\n');

    fs.open(filename, 'a', function( e, id ) {
        if(e){
            console.log("Foutje: " + e);
        }
        else{
            fs.write( id, buffer, 0, buffer.length, null, function(err){
                if(err) {
                    console.log(err);
                } else {
                    console.log("De log file is aangevuld.");
                }
            });
        }

    });
    if(typeof(callback)=='function'){ callback(); }
};
    exports.log = function(data, addDate, callback){
        if (typeof addDate === 'undefined') { myVariable = false; }
        var now = new Date();
        var date = now.getDate() + "-" + (now.getMonth() + 1) + "-" + now.getFullYear();
        var time = now.getHours() + now.getMinutes();

        if(addDate){
            data = data + date + " " + now.toLocaleTimeString();
        }
        var buffer = new Buffer(data + '\r\n');

        fs.open(filename, 'a', function( e, id ) {
            if(e){
                console.log("Foutje: " + e);
                //execute call back here.
                if(typeof callback === 'function'){ 
                  callback(e); 
                }
            }
            else{
                fs.write( id, buffer, 0, buffer.length, null, function(err){
                    if(err) {
                        console.log(err);
                    } else {
                        console.log("De log file is aangevuld.");
                    }
                    //execute call back here.
                    if(typeof callback === 'function'){ 
                      callback(err); 
                    }
                });
            }

        });
     };
process.on ("SIGINT", function(){
    logger.log("SERVER SHUTDOWN: ", true);
    logger.log("-----------------------------------------");
    logger.log("", false, function(e){
        if(e){
          //Handle error here.
        }
        process.exit();
    });
});