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

Posted

技术标签:

【中文标题】如何让 child_process.spawn 在我的 TypeScript 模块中返回一个 Promise?【英文标题】:How can I make child_process.spawn return a Promise in my TypeScript module? 【发布时间】:2019-04-11 18:03:07 【问题描述】:

我正在尝试编写一个小模块,它使用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 )

有什么建议吗?

【问题讨论】:

【参考方案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);
    );
  );

【讨论】:

“另外,你在错误的时间挂钩了错误事件(据我所知,通过错误的方法)”太接近了:D

以上是关于如何让 child_process.spawn 在我的 TypeScript 模块中返回一个 Promise?的主要内容,如果未能解决你的问题,请参考以下文章

如何模拟 Node.js child_process spawn 函数?

如何将字符串解析为 child_process.spawn 的适当参数?

节点 child_process.spawn 多个命令

nodejs child_process.spawnSync 或 child_process.spawn 包裹在 yieldable 生成器中,它返回输出

child_process spawn() 中的通配符?

使用管道字符 |与 child_process spawn