在 nodejs 中依次 运行 函数
sequentially run functions in nodejs
我是 node 的新手,运行 遇到了 运行 按顺序执行某些函数和使用回调的问题。我曾尝试使用 async 模块,但是,我想我遗漏了一些东西,因为它会乱序执行我的功能。
用最简单的术语来说,我想以 url 参数的形式检索一些数据,然后:
1.将它们写入文件
2. lpr打印出来
3.删除文件
我当前的代码在第 printing.ie 步 2.Would 之前的第 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();
}
]);
});
您在 exec()
的同一级别调用 callback()
函数,exec 是异步的,删除文件后将记录 "file printed",因为 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();
});
},
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
有史以来最好的承诺结构
我是 node 的新手,运行 遇到了 运行 按顺序执行某些函数和使用回调的问题。我曾尝试使用 async 模块,但是,我想我遗漏了一些东西,因为它会乱序执行我的功能。
用最简单的术语来说,我想以 url 参数的形式检索一些数据,然后: 1.将它们写入文件 2. lpr打印出来 3.删除文件
我当前的代码在第 printing.ie 步 2.Would 之前的第 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();
}
]);
});
您在 exec()
的同一级别调用 callback()
函数,exec 是异步的,删除文件后将记录 "file printed",因为 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();
});
},
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
有史以来最好的承诺结构