如何在我的 TypeScript 模块中使 child_process.spawn return 成为 Promise?
How can I make child_process.spawn return a Promise in my TypeScript module?
我正在尝试编写一个使用 child_process.spawn
克隆 git 存储库和 return 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);
}
这是失败的异步代码 returns 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
})
有什么建议吗?
大功告成,您只需要 return 来自 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);
});
});
}
我正在尝试编写一个使用 child_process.spawn
克隆 git 存储库和 return 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);
}
这是失败的异步代码 returns 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
})
有什么建议吗?
大功告成,您只需要 return 来自 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);
});
});
}