似乎无法将client.shell()命令的输出保存到变量

时间:2014-08-16 21:34:58

标签: javascript node.js adb node-webkit node-modules

我正在使用node-webkit和ADBkit尝试从android build.prop读取一行,并根据该行的内容做一些事情。

http://pastebin.com/7N7t1akk

的完整脚本

它的主旨是:

var model = client.shell(devices, "su -c 'grep ro.product.model /system/build.prop'" );  
alert(model)

我想将build.prop中的ro.product.model读入变量model
作为测试我只是尝试创建一个显示此shell命令返回的alert,在我的情况下ro.product.model=KFSOWI,但每当我使用连接设备运行此脚本时,alert都会返回{{ 1}}

编辑** 我刚刚意识到object Object可能会更好,但不能很好地理解这些功能(特别是回调)

我是Javascripting这个领域的新手,家里有人可以提供一些见解

3 个答案:

答案 0 :(得分:0)

JavaScript是异步编程语言,它建立在回调之上。每个函数都应该有回传并传递给它的数据,如果你在documentation上观看,你有client.shell(serial, command[, callback])因此执行client.shell()的数据将被传递给callback。你应该指定一些将处理回调的函数,你的情况就是这个

client.shell(devices, "su -c 'grep ro.product.model /system/build.prop'", function(data) {
    console.log(data);
});

P.S。 nodejs中没有alert

答案 1 :(得分:0)

根据文档,你可以在client.shell()回调的第二个参数中捕获输出:

client.shell(devices, "su -c 'grep ro.product.model /system/build.prop'", function(err, output) {
  if (err) {
    console.log(err);
  }
  console.log(output);
});

答案 2 :(得分:0)

使用async / await以获得更清晰的代码。

const data = await client.shell(devices, "su -c 'grep ro.product.model /system/build.prop'" );

console.log(data); // => "Samsung.TM395"

当然,仅当此代码在async函数中时,此方法才有效。

流数据。

对于使用adbkit进行流式处理的数据,您需要做更多的工作来读取整个流,然后输出结果,就像这样:

const stream = await adbClient.shell( config.udid, "ime list -s" ) // adb command to list possible input devices (e.g. keyboards, etc.).
const result = await adb.util.readAll( stream );
console.log( result.toString() ); // => com.sec.android.inputmethod/.SamsungKeypad