Node.js顺序从 q all 运行多个子进程.execFile 进程



我正在编写一个程序来批量打印图纸。它们需要按一定的顺序排列,例如图纸 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]));

我没有专门尝试过这个,但要点是你在为它创建延迟的同时调用你的方法。

相关内容

  • 没有找到相关文章

最新更新