第一次发布在这里,我希望有人可以帮助它将不胜感激。ES6类函数返回undefined值
因此,我正在编写一个ES6中的程序,我已经用python编写了,所有的东西都能在python中完美运行,但我希望迁移到ES6,希望能够与Electron制作桌面应用程序。
我有创建一个Drive对象,并填充在Drive变量类,我有执行外壳命令的功能。我希望能够将Drive变量(例如'this.mdts')分配给我正在运行的命令的输出,但它只返回未定义的。我可以在输出创建时将输出记录到控制台,但它不会将相同的值返回给变量。
下面是一些代码片段:
这是drive.js
var sys = require('util')
const exec = require('child_process').exec
export default class Drive {
constructor(node,sn) {
this.node = node
this.sn = sn
this.mdts = this.getIdCtrl("mdts")
}
getIdCtrl(specifier) {
exec('nvme id-ctrl /dev/' + this.node,(e,stdout,stderr) => {
if (e instanceof Error) {
console.error(e);
throw e;
}
let line = stdout.split('\n')
for(let i = 0; i<line.length;i++) {
if (line[i].includes(specifier)) {
console.log(line[i]) // prints exactly what I want
return line[i]
}
}
})
}
}
这里就是我创建Drive对象test.js
import Drive from './drive';
var sys = require('util')
var exec = require('child-process-promise').exec;
var child;
let fs = require('fs')
let listOfDrives = []
function runTest() {
exec("nvme list").then(function (result) {
let stdout = result.stdout;
let stderr = result.stderr;
let error = result.error;
var line = stdout.split('\n');
for(let i = 0; i<line.length;i++) {
if (line[i].includes("/dev/")) {
if (listOfDrives.length == 0) {
let x = new Drive(line[i].slice(5,13).trim(),line[i].slice(17,37).trim())
listOfDrives.push(x)
}
else {
for (let x in listOfDrives) {
if (x.sn == line[i].slice(17,37).trim()) {
break
}
}
let x = new Drive(line[i].slice(5,13).trim(),line[i].slice(17,37).trim())
listOfDrives.push(x)
}
}
}
if (error) {
console.log('exec error: ' + error);
}
console.log(listOfDrives[0])
for(let x of listOfDrives) {
console.log(x.sn);
}
})
}
runTest()
当它运行后我返回Drive对象,我得到这个输出:
我试过child-process-promise
在Drive.js中就像test.js,但无济于事。
非常感谢您考虑看看
编辑:
这里的drive.js
的更新版本var sys = require('util')
const exec = require('child-process-promise').exec
export default class Drive {
constructor(node,sn) {
this.node = node
this.sn = sn
this.mdts = this.getIdCtrl("mdts")
}
getIdCtrl(specifier) {
return exec('nvme id-ctrl /dev/' + this.node).then(function (result) {
let stdout = result.stdout;
let stderr = result.stderr;
let error = result.error;
if (error instanceof Error) {
console.error(e);
throw e;
}
let line = stdout.split('\n')
for(let i = 0; i<line.length;i++) {
if (line[i].includes(specifier)) {
console.log(line[i]) // prints exactly what I want
return line[i]
}
}
})
}
}
编辑:
以下是驱动器的返回:
Drive {
node: 'nvme0n1',
sn: '66GP6035PCTU',
mdts:
ChildProcessPromise {
<pending>,
_cpResolve: [Function: y],
_cpReject: [Function: z],
childProcess:
ChildProcess {
domain: null,
_events: [Object],
_eventsCount: 2,
_maxListeners: undefined,
_closesNeeded: 3,
_closesGot: 0,
connected: false,
signalCode: null,
exitCode: null,
killed: false,
spawnfile: '/bin/sh',
_handle: [Object],
spawnargs: [Object],
pid: 7858,
stdin: [Object],
stdout: [Object],
stderr: [Object],
stdio: [Object] } } }
的可能的复制[如何返回从一个异步调用的响应?](http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-打电话) –
@JaromandaX这是不是异步? https://nodejs.org/api/child_process。html#child_process_child_process_exec_command_options_callback –
感谢@JaromandaX的快速反应,在过去的两天里我一直在处理这个问题,并且遇到了一些需要返回exec的路线,当我这样做的时候,我得到了一个' ChildProcess'对象返回,而不是我正在寻找的字符串 – Darren