Javascript 返回未定义值的ES6类函数
第一次在这里发布,我希望有人能帮助我,我将不胜感激 所以我正在用ES6编写一个程序,我已经用python编写了这个程序,所有的东西都在python中完美地工作,但是我想迁移到ES6,希望用Electron制作一个桌面应用程序 我有一个创建驱动对象的类,为了填充驱动中的变量,我有一个执行shell命令的函数。我希望能够为正在运行的命令的输出分配一个驱动器变量,例如'this.mdts',但它只返回未定义的。我可以在创建输出时将其记录到控制台,但它不会将相同的值返回到变量 下面是一些代码片段: 这是drive.jsJavascript 返回未定义值的ES6类函数,javascript,ecmascript-6,Javascript,Ecmascript 6,第一次在这里发布,我希望有人能帮助我,我将不胜感激 所以我正在用ES6编写一个程序,我已经用python编写了这个程序,所有的东西都在python中完美地工作,但是我想迁移到ES6,希望用Electron制作一个桌面应用程序 我有一个创建驱动对象的类,为了填充驱动中的变量,我有一个执行shell命令的函数。我希望能够为正在运行的命令的输出分配一个驱动器变量,例如'this.mdts',但它只返回未定义的。我可以在创建输出时将其记录到控制台,但它不会将相同的值返回到变量 下面是一些代码片段: 这是
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.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]
}
}
})
}
}
var sys=require('util'))
const exec=require('child-process-promise')。exec
导出默认类驱动器{
构造函数(节点,序号){
this.node=节点
this.sn=sn
this.mdts=this.getIdCtrl(“mdts”)
}
getIdCtrl(说明符){
返回exec('nvmeidctrl/dev/'+this.node)。然后(函数(结果){
设stdout=result.stdout;
设stderr=result.stderr;
让error=result.error;
if(错误实例of error){
控制台错误(e);
投掷e;
}
let line=stdout.split('\n')
例如(让我=0;我在谷歌搜索了好几天之后,我找到了我问题的答案,因此对于任何可能与我处于同样困境的人来说,这个链接提供了一个聪明而简单的解决方法,对于任何对JS/ES6有相当了解的人来说,这似乎微不足道,但唉,我还不属于这一类……)
因此,需要进行一个简单的while循环检查,以查看流程是否完成,并推迟返回值,直到完成为止
它几乎使我所有的代码都变得多余,并且消除了对承诺的需要,它可能不是最有效的,但它符合我的目的。可能重复@JaromandaX,这不是异步的吗?感谢@JaromandaX的快速响应,在过去的两天里我一直在摆弄它,我遇到了一些返回的帖子exec是一种方法,但当我这样做时,返回的是一个“ChildProcess”对象,而不是我正在查找的字符串for@JaromandaX我不能完全确定,当我使用子进程承诺
并返回exec时,我得到了一个待定的承诺returned@JaromandaX确切地
{node: 'nvme0n1', sn: 'xxxx10', mdts: undefined }
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] } } }