【问题标题】:How can I make child_process.spawn return a Promise in my TypeScript module?如何让 child_process.spawn 在我的 TypeScript 模块中返回一个 Promise?
【发布时间】: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 })

有什么建议吗?

【问题讨论】:

    标签: typescript async-await child-process spawn


    【解决方案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
    猜你喜欢
    • 2022-11-29
    • 2019-01-24
    • 2023-03-13
    • 2019-09-17
    • 2017-06-09
    • 1970-01-01
    • 2020-08-06
    • 2021-09-11
    • 2020-12-08
    相关资源
    最近更新 更多