2017-04-27 98 views
-2

第一次发布在这里,我希望有人可以帮助它将不胜感激。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] } } } 
+0

的可能的复制[如何返回从一个异步调用的响应?](http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-打电话) –

+0

@JaromandaX这是不是异步? https://nodejs.org/api/child_process。html#child_process_child_process_exec_command_options_callback –

+0

感谢@JaromandaX的快速反应,在过去的两天里我一直在处理这个问题,并且遇到了一些需要返回exec的路线,当我这样做的时候,我得到了一个' ChildProcess'对象返回,而不是我正在寻找的字符串 – Darren

回答

0

经过几天和几天的搜索后,我发现了一个答案,因此对于任何可能和我一样陷入同样困境的人来说,这个链接提供了一个聪明而简单的解决方法,对于拥有JS/ES6体面知识的人来说,这似乎微不足道,但唉我不是该类别....尚未;)

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

所以一个简单的while循环检查,看看是否该过程已完成,并持观望返回一个值,直到它完成。

它几乎做所有我的代码冗余并消除了对承诺的需要,它可能不是最有效的,但它适合我的目的。