let commandPromise = async (command) => {
try {
return new Promise((resolve, reject) => {
try {
child_process.exec(command, (error, stdout, stderr) => {
if (error) return reject(error);
if (stderr) return reject(stderr);
return resolve(stdout)
})
} catch (err) {
return reject(err)
}
})
} catch (err) {
throw err
}
};
在这种情况下捕获错误是正确的方法还是存在更好的方法?代码似乎不好。
答案 0 :(得分:2)
对于您的情况,如果在新的Promise()之前添加“ await”,一切都会奏效
let commandPromise = async (command) => {
try {
return await new Promise((resolve, reject) => {
try {
child_process.exec(command, (error, stdout, stderr) => {
if (error) return reject(error);
if (stderr) return reject(stderr);
return resolve(stdout)
})
} catch (err) {
return reject(err)
}
})
} catch (err) {
throw err
}
};
答案 1 :(得分:1)
您在这里缺少概念,但这是黄金法则:
在您的代码上,这是一种简单的方法:
const commandPromise = async (command) => {
return new Promise((resolve, reject) => {
child_process.exec(command, (error, stdout, stderr) => {
if (error) {
return reject(error);
}
if (stderr) {
return reject(stderr);
}
return resolve(stdout)
});
});
};
ES7方式:
const commandPromise = async function(command) {
child_process.exec(command, (error, stdout, stderr) => {
if (error) {
throw error;
}
if (stderr) {
throw stderr;
}
return stdout;
});
};
答案 2 :(得分:1)
try - catch
中的两个块都是不必要的,您可以摆脱它们。
此外,由于commandPromise
不使用await
关键字,因此您也可以从函数声明中删除async
关键字。
执行child_process
时发生的任何错误都将作为error
传递到您的代码已处理的回调中。
这是更好的代码:
let commandPromise = (command) =>
new Promise((resolve, reject) => {
child_process.exec(command, (error, stdout, stderr) => {
if (error) return reject(error);
if (stderr) return reject(stderr);
return resolve(stdout);
});
});
并使用它:
commandPromise(/* some command */)
.then(() => {
/* ok */
})
.catch((error) => {
/* handle error */
});
答案 3 :(得分:0)
通过.catch()方法可以捕获在诺言中抛出或拒绝的错误。尝试/捕获不适用于异步代码。
您可以像这样使用它:
promise.catch(function(err) {
// do something
})
有关更多详细信息,请参见针对同一问题的其他stackoverflow answers。