Как я могу заставить child_process.spawn возвращать Promise в моем модуле TypeScript? - PullRequest
0 голосов
/ 08 ноября 2018

Я пытаюсь написать небольшой модуль, который использует child_process.spawn для клонирования git-репо и возврата Promise, но мне это не удается. Когда я использую 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 Ответ

0 голосов
/ 08 ноября 2018

Вы близки, вам просто нужно вернуть обещание из вашей функции 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);
    });
  });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...