NodeJS队列多个execFile调用

时间:2017-10-07 02:55:29

标签: node.js promise child-process

我正在制作一个基于网络的工具,它挂钩到一个名为RetroPie-Setup的现有基于shell的框架。

他们有一个名为/RetroPie-Setup/retropie_packages.sh的shell脚本,您可以使用它来安装,获取依赖项,甚至编译不同的程序。

一个问题是packages.sh不应该在给定时刻多次运行,所以我需要设置一次运行一个队列。

我想我可以使用promise-queue来防止多次执行,但每当我运行execFile时,它会立即运行命令,而不是当它命中队列中的某个位置时。

以下是我的示例代码:

downloadTest.sh (下载具有唯一名称的10Mb文件):

filename=test$(date +%H%M%S).db
wget -O ${filename} speedtest.ftp.otenet.gr/files/test10Mb.db
rm ${filename}

节点代码

const Queue = require('promise-queue')
const { spawn,execFile } = require('child_process');
var maxConcurrent = 1;
var maxQueue = Infinity;
var que = new Queue(maxConcurrent, maxQueue);

var testFunct = function(file)
{
    var promise = new Promise((reject,resolve) => {
        execFile(file,function(error, stdout, stderr) {
            console.log('Finished executing');
            if(error)
            {
                reject();
            } else
            {
                resolve(stdout);
            }
        });
    })
    return promise;
}
var test1 = testFunct('/home/pi/downloadTest.sh')
var test2 = testFunct('/home/pi/downloadTest.sh')
var test3 = testFunct('/home/pi/downloadTest.sh')
que.add(test1);
que.add(test2);
que.add(test3);

1 个答案:

答案 0 :(得分:3)

您的代码非常接近工作。主要问题是你正在执行testFunct(),而que.add(testFunct.bind(null, '/home/pi/downloadTest.sh')); que.add(testFunct.bind(null, '/home/pi/downloadTest.sh')); que.add(testFunct.bind(null, '/home/pi/downloadTest.sh')); 又会返回一个Promise,它会立即开始执行其中的内容。要解决此问题,可以使用Function.prototype.bind()将参数绑定到函数而不执行它。像这样:

async/await

或者,你可以使用promise-queue来实现一个简单的队列,这反过来又允许你放弃对const execFile = require("util").promisify(require("child_process").execFile) (async function () { let scripts = [ "/home/pi/downloadTest.sh", "/home/pi/downloadTest.sh", "/home/pi/downloadTest.sh" ] for (let script of scripts) { try { let { stdout, stderr } = await execFile(script) console.log("successfully executed script:", script) } catch (e) { // An error occured attempting to execute the script } } })() 的依赖。

await execFile(script)

上述代码中有趣的部分是await。当你execFile表达式时,整个函数的执行暂停,直到<ion-content overflow-scroll="true"> <video controls="controls" preload="metadata" autoplay="autoplay" webkit-playsinline="webkit-playsinline" class="videoPlayer"> <source src="./assets/videos/Part_1.mp4" type="video/mp4" /> </video> </ion-content> 函数返回的Promise解析或拒绝,这意味着你有一个按顺序执行的队列。