ES6类函数返回未定义的值

时间:2017-04-27 11:09:53

标签: javascript ecmascript-6

第一次发布在这里,我希望有人可以帮助它,我们将非常感激。

所以我在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] } } }

1 个答案:

答案 0 :(得分:0)

我在谷歌搜索的日子和天后找到了我的问题的答案,所以对于任何可能与我一样处于同样困境的人来说,这个链接提供了一个简单而简单的解决方法,这对任何具有JS / ES6知识的人来说都是微不足道的但是,我不在那个类别......但是;)

https://strongloop.com/strongblog/whats-new-in-node-js-v0-12-execsync-a-synchronous-api-for-child-processes/

这是一个简单的while循环检查,看看过程是否完成,并且在它完成之前一直保持返回值。

它几乎使我的所有代码都变得冗余,并且不需要承诺,它可能不是最有效的,但它可以用于我的目的。