第一次发布在这里,我希望有人可以帮助它,我们将非常感激。
所以我在ES6中编写了一个程序,我已经用python编写过了,所有内容都在python中完美运行但是我想迁移到ES6,希望用Electron制作桌面应用程序。
我有一个创建Drive对象的类,并且为了填充Drive中的变量,我有一个执行shell命令的函数。我希望能够分配一个Drive变量,例如' this.mdts'我正在运行的命令的输出,但它只返回undefined。我可以在创建时将输出记录到控制台,但它不会将相同的值返回给变量。
以下是代码的一些片段:
这是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]
}
}
})
}
}
这是test.js,我在其中创建了Drive对象
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对象,我得到了这个输出:
{node: 'nvme0n1', sn: 'xxxx10', mdts: undefined }
我在Drive.js中尝试child-process-promise
就像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] } } }
答案 0 :(得分:0)
我在谷歌搜索的日子和天后找到了我的问题的答案,所以对于任何可能与我一样处于同样困境的人来说,这个链接提供了一个简单而简单的解决方法,这对任何具有JS / ES6知识的人来说都是微不足道的但是,我不在那个类别......但是;)
这是一个简单的while循环检查,看看过程是否完成,并且在它完成之前一直保持返回值。
它几乎使我的所有代码都变得冗余,并且不需要承诺,它可能不是最有效的,但它可以用于我的目的。