Подождите, пока дочерний процесс завершится, прежде чем вернуться без использования машинописного текста задержки - PullRequest
0 голосов
/ 28 мая 2020

Я пытаюсь выполнить команду оболочки, используя дочерний процесс в моем расширении vscode с помощью машинописного текста, но я не могу получить правильный порядок без использования функции задержки.

Я не хочу использовать жестко запрограммированную временную задержку, но хочу, чтобы она ждала, пока дочерний процесс не завершится, прежде чем возвращаться из функции. Есть ли способ изменить код для выполнения sh этого?

async function executeCommand(inCommand:string, inArgs:Array<string>)
{
    var retBool = false;
    console.log("Beginning of function");

    // Initialize Child
    const { spawn } = require('child_process');
    const child = spawn(inCommand, inArgs);

    // On receive of stdout
    child.stdout.on('data', (data:any) => 
    {
        console.log("Child stdout: " + data);
    });

    // On receive of error
    child.stderr.on('data', (data:any) => 
    {
        console.error("Child stderr: " + data);
    });

    // On exit
    child.on('exit', function(code:any, signal:any)
    {
        // Only set to true if the child exited without any errors
        if(code.toString() === "0") {
            retBool = true;
        }
        console.log("Child process exited with: " + code + ", >" + signal+ "<");
    });

    await delay(1000); // <------------ How can I rearrange to get rid of this?
    console.log("End of function");
    return retBool;
}

function delay(ms: number) {
    return new Promise( resolve => setTimeout(resolve, ms) );
}

// ------- In Main Function --------
    var commandExecuteSuccess = false;
    var prom = Promise.resolve(executeCommand('pwd', []));
    prom.then(function(value)
    {
        commandExecuteSuccess = value;
    });

    await delay(2000); // <--------------------- And this one too
    if(commandExecuteSuccess) {
        console.log("Executed successfully");
    } else {
        console.error("There was an error");
    }

Прямо сейчас, если я не использую задержки в консоли отладки, я получаю:
Начало функции
Конец функции
Произошла ошибка
вывод команды

...