Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 返回未定义值的ES6类函数_Javascript_Ecmascript 6 - Fatal编程技术网

Javascript 返回未定义值的ES6类函数

Javascript 返回未定义值的ES6类函数,javascript,ecmascript-6,Javascript,Ecmascript 6,第一次在这里发布,我希望有人能帮助我,我将不胜感激 所以我正在用ES6编写一个程序,我已经用python编写了这个程序,所有的东西都在python中完美地工作,但是我想迁移到ES6,希望用Electron制作一个桌面应用程序 我有一个创建驱动对象的类,为了填充驱动中的变量,我有一个执行shell命令的函数。我希望能够为正在运行的命令的输出分配一个驱动器变量,例如'this.mdts',但它只返回未定义的。我可以在创建输出时将其记录到控制台,但它不会将相同的值返回到变量 下面是一些代码片段: 这是

第一次在这里发布,我希望有人能帮助我,我将不胜感激

所以我正在用ES6编写一个程序,我已经用python编写了这个程序,所有的东西都在python中完美地工作,但是我想迁移到ES6,希望用Electron制作一个桌面应用程序

我有一个创建驱动对象的类,为了填充驱动中的变量,我有一个执行shell命令的函数。我希望能够为正在运行的命令的输出分配一个驱动器变量,例如'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.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] } } }