typescript - 如何让 child_process.spawn 在我的 TypeScript 模块中返回一个 Promise?

标签 typescript async-await child-process spawn

我正在尝试编写一个使用 child_process.spawn 的小模块克隆一个 git repo 并返回一个 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 })
任何建议如何做到这一点?

最佳答案

你已经接近了,你只需要从你的clone返回 promise 函数(不需要是 async ,因为您需要显式创建 promise )。此外,您在错误的时间 Hook 错误事件(据我所知,通过错误的方法):

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);
    });
  });
}

关于typescript - 如何让 child_process.spawn 在我的 TypeScript 模块中返回一个 Promise?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53204192/

相关文章:

typescript 和 Sequelize : Pass in generic Model

javascript - 如何将异步 Promise 函数重构为非异步以避免反模式

node.js - 检查是否全局安装了特定的 NPM 包

node.js - 使用 Node JS child_process.spawn 运行脚本时打开文件过多

创建一个程序来计算系统中的最大进程数

javascript - 在 Angular 中渲染组件/HTML 文件之前获取数据

javascript - 无法获取属性值 'elementType' : object is null or undefined

javascript - 如何在 Typescript 中声明来自另一个文件的函数?

c# - 当尝试使用Task.Run()在MySql中运行插入查询时,它抛出以下异常: "Unable to connect to any of the specified MySQL hosts."

c# - 替代 CurrentManagedThreadId 在等待过程中保持不变?