如何使child_process.spawn在TypeScript模块中返回Promise



我正试图编写一个小模块,该模块使用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(。此外,您在错误的时间挂接错误事件(据我所知,通过错误的方法(:

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

最新更新