我正在编写一个程序来批量打印图纸。它们需要按一定的顺序排列,例如图纸 A、B、C。该程序绘制正确的打印数量,只是顺序是随机的。我需要在下一个之前完成数组列表中的第一个,依此类推。
startMe(newPaths)
.then(function(result){
})
function startMe(dwgPaths){
return q.all(buildCalls(dwgPaths));
}
var buildCalls = function(dwgPaths) {
var calls = [];
var scFiles = [tmpDir + "425011-fab.scr",tmpDir + "425011-pk.scr",tmpDir + "425011-sc.scr"];
for (var sc in scFiles){
for (var i in dwgPaths) {
calls.push(callAccoreConsole(dwgPaths[i],scFiles[sc]));
}
}
return calls;
};
function callAccoreConsole(dwgPath,scrFile){
var deferred = q.defer();
childProcess.execFile('C:/Program Files/Autodesk/AutoCAD 2015/accoreconsole.exe',['/i',dwgPath,'/s',scrFile], function(err, data) {
if(err)
deferred.resolve({success:false,reason: err});
deferred.resolve({success:true});
});
return deferred.promise;
}
下面的代码按照我想要的方式工作。我打印 2 个文件,每个文件 3 份。文件A使用脚本1,然后文件B使用脚本1。然后对其他脚本重复此操作。我总共有 6 张印刷品"三组"A、B、A、B、A、B,每组都有适当的脚本运行。使用上面的代码,我可能会得到B,A,A,B,A,A。
callAccoreConsole(newPaths[0],scFiles2[0])
.then(function(result){
callAccoreConsole(newPaths[1],scFiles2[0])
.then(function(result){
callAccoreConsole(newPaths[0],scFiles2[1])
.then(function(result){
callAccoreConsole(newPaths[1],scFiles2[1])
.then(function(result){
callAccoreConsole(newPaths[0],scFiles2[2])
.then(function(result){
callAccoreConsole(newPaths[1],scFiles2[2])
.then(function(result){
})
})
})
})
})
});
我已经为此苦苦挣扎了一段时间。我找到了下面的代码并让它适用于我的应用程序,但这似乎不是最有效的编写方式。如果有人有更紧凑的方式,请告诉我。谢谢
var itemsToProcess = [];
for (var sc in scFiles){
for (var i in newPaths) {
itemsToProcess.push( {file:newPaths[i],script:scFiles[sc]});
}
}
function getDeferredResult(a) {
return (function (items) {
var deferred;
if (items.length === 0) {
return q.resolve(true);
}
deferred = q.defer();
var payload = {
file:items[0].file,
script:items[0].script
};
callAccoreConsole2(payload)
.then(function(result){
deferred.resolve(items.splice(1));
});
return deferred.promise.then(getDeferredResult);
}(a));
}
q.resolve(itemsToProcess)
.then(getDeferredResult)
.then(function(result){
return res.send({success:true});
})
当你构造你的承诺数组时,你同时调用execFile方法。
function callAccoreConsole(dwgPath,scrFile){
var deferred = q.defer();
childProcess.execFile('C:/Program Files/Autodesk/AutoCAD 2015/accoreconsole.exe',['/i',dwgPath,'/s',scrFile], function(err, data) {
if(err)
deferred.resolve({success:false,reason: err});
deferred.resolve({success:true});
});
return deferred.promise;
}
因此,与其使用 callAccoreConsole
来运行进程并返回 deffered,不如最终调用该方法 -
calls.push(q.fcall(callAccoreConsole, dwgPaths[i],scFiles[sc]));
我没有专门尝试过这个,但要点是你在为它创建延迟的同时调用你的方法。