Как я могу заставить 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);
    });
  });
}
Другие вопросы по тегам