0

私はノードに非常に慣れていないため、いくつかの関数を順番に実行し、コールバックを使用する際に問題が発生しました。async モジュールを使用しようとしましたが、関数が順不同で実行されるため、何かが足りないと思います。

最も簡単に言えば、いくつかのデータを url パラメータの形式で取得してから、次のようにします。 1. それらをファイルに書き込みます 2. lpr 印刷します 3. ファイルを削除します

私の現在のコードは、印刷する前にファイルを削除します。つまり、ステップ 2 の前にステップ 3 を実行します。前もって感謝します。

router.get('/zplprint/:barcode/:zpl', function(req, res) {
var zpl = req.params.zpl;
var filename  = appDir + "/uploads/" + req.params.barcode + ".zpl";
console.log(req.params.zpl);
res.send("received zpl: " + req.params.zpl);

async.series([
    function(callback){
        fs.writeFile(filename, zpl, function(err) {
        if(err) {
            callback(err);
            return;
        }
        console.log("The file was saved! to "+filename);
            callback();
        });
    },
    function(callback){
        CupsPrinterName = nconf.get('Print:PrinterName');
        console.log(CupsPrinterName);
        var cmd = 'lpr -P ' + CupsPrinterName + ' -o raw ' + filename;
        exec(cmd, function(error, stdout, stderr) {
            // command output is in stdout'
            console.log(cmd);
            console.log("file printed");
        });
        callback();
    },
    function(callback){
        fs.unlink(filename, function (err) {
            console.log('   deleting ' + filename);

        });
        callback();
    }
]);

});

4

2 に答える 2

0

callback()の同じレベルで関数を呼び出しています。exec は非同期であり、関数の終了時ではなくexec()外部で callback() が呼び出されたため、ファイルを削除した後に「ファイルが印刷されました」をログに記録します。exec()印刷後にコールバックを呼び出してみてください:

function(callback){
    CupsPrinterName = nconf.get('Print:PrinterName');
    console.log(CupsPrinterName);
    var cmd = 'lpr -P ' + CupsPrinterName + ' -o raw ' + filename;
    exec(cmd, function(error, stdout, stderr) {
        // command output is in stdout'
        console.log(cmd);
        console.log("file printed");
        callback();
    });        
},
于 2015-11-05T15:29:52.897 に答える
0
var Q = require('q')


router.get('/zplprint/:barcode/:zpl', function(req, res) {
var zpl = req.params.zpl;
var filename  = appDir + "/uploads/" + req.params.barcode + ".zpl";
console.log(req.params.zpl);
res.send("received zpl: " + req.params.zpl);


    function first(callback){
        var d1 = Q.defer();
        fs.writeFile(filename, zpl, function(err) {
            if(err) {
                d1.reject(err);

            }
            console.log("The file was saved! to "+filename);
            d1.resolve("success");
        });
        return d1.promise
    }



    function second(callback){
        var d2  = Q.defer()
        CupsPrinterName = nconf.get('Print:PrinterName');
        console.log(CupsPrinterName);
        var cmd = 'lpr -P ' + CupsPrinterName + ' -o raw ' + filename;
        exec(cmd, function(error, stdout, stderr) {
           if(error){
               d2.reject()
           }
            console.log(cmd);
            console.log("file printed");
            d2.resolve()
        });
        return d2.promise
    }



    function third(callback){
        var d3 = Q.defer()
        fs.unlink(filename, function (err) {
            if(err){
                d3.reject()
            }
            console.log('   deleting ' + filename);
                d3.resolve()
        });
        return d3.promise
    }

  first().then(second).then(third).fail(function(){
    console.log("Error !!!!")


})

});

前提条件:

npm install q 

史上最高のプロミス構造

于 2015-11-06T06:17:21.330 に答える