Как я могу заставить child_process.spawn возвращать Promise в моем модуле TypeScript?
Я пытаюсь написать небольшой модуль, который использует child_process.spawn
клонировать git-репо и вернуть Обещание, но мне это не удалось. Когда я использую spawnSync, это работает.
Вот код синхронизации, который работает.
import {spawnSync} from 'child_process';
export default async function clone(options: { url: string; path: string; }) {
const url = options.url;
const target = options.path;
const args = ['clone', url, target];
return spawnSync('git', args);
}
Это асинхронный код, который не работает и возвращает undefined
import {spawn} from 'child_process';
export default async function clone(options: { url: string; path: string; }) {
const url = options.url;
const target = options.path;
const args = ['clone', url, target];
const process = spawn('git', args);
process.on('close', function () {
return new Promise(function (resolve, reject) {
process.addListener('error', reject);
process.addListener('exit', resolve);
});
});
}
Я также попробовал:
process.on('close', function (code) {
return code;
});
или же
process.on('close', function (code) {
return Promise.resolve(code);
});
и несколько других вещей, таких как …on('exit', function(code){
return code
})
Любые предложения, как это сделать?
1 ответ
Решение
Вы близки, вам просто нужно вернуть обещание от вашего clone
функция (которая не должна быть async
, так как вам нужно явно создать обещание). Кроме того, вы перехватываете событие ошибки в неправильное время (и, насколько я могу судить, с помощью неправильного метода):
import {spawn} from 'child_process';
// *** Not async
export default function clone(options: { url: string; path: string; }) {
// *** Return the promise
return new Promise(function (resolve, reject) {
const url = options.url;
const target = options.path;
const args = ['clone', url, target];
const process = spawn('git', args);
process.on('close', function (code) { // Should probably be 'exit', not 'close'
// *** Process completed
resolve(code);
});
process.on('error', function (err) {
// *** Process creation failed
reject(err);
});
});
}