Javascript 子进程exec命令被执行多次
我正在使用Javascript 子进程exec命令被执行多次,javascript,electron,child-process,Javascript,Electron,Child Process,我正在使用exec()运行一个终端命令来显示electron mac应用程序中的对话框 我正在使用的代码: var exec = require('child_process').exec; var request = require('request'); request('https://server_url', function (error, response, data) { console.log("inside request"); exec(`osascri
exec()
运行一个终端命令来显示electron mac应用程序中的对话框
我正在使用的代码:
var exec = require('child_process').exec;
var request = require('request');
request('https://server_url', function (error, response, data) {
console.log("inside request");
exec(`osascript -e 'with timeout of 86400 seconds
tell app "System Events"
display dialog "` + data.pop_up_message + `" buttons {"OK", "Cancel"}
end tell
end timeout'
`, function(error, stdout, stderr){
console.log("inside exec");
});
});
inside request
inside exec
inside exec
inside exec
它在一个请求中显示多个对话框
控制台输出:
var exec = require('child_process').exec;
var request = require('request');
request('https://server_url', function (error, response, data) {
console.log("inside request");
exec(`osascript -e 'with timeout of 86400 seconds
tell app "System Events"
display dialog "` + data.pop_up_message + `" buttons {"OK", "Cancel"}
end tell
end timeout'
`, function(error, stdout, stderr){
console.log("inside exec");
});
});
inside request
inside exec
inside exec
inside exec
此处“内部请求”
仅打印一次。但是'insideexec'
正在被打印多次。
这个问题的原因是什么。如何解决这个问题。内部函数是一个连接到两个流的回调:
stdout
和stderr
。第三个参数是一个错误对象,如果子进程失败或超时,它通常包含一些内容(请参阅:)
无论何时执行某项操作,其输出都会在一段时间后通过其中一项发送消息到达。它可能发生在不久之后,也可能发生在很长一段时间之后。此外,它可以是一个相当小或很大的输出,因此根据执行的操作,它将成为数据块。stdout
每隔5秒向控制台打印一次,然后使用NodeJS模块调用它
您的console.log
一旦检测到通过这些流之一发送的消息,就会立即打印一些内容。在这种特定情况下,它将每5秒打印一次
这只是一个小图片,因为关于什么是流以及它们是如何工作的,可能还有很多要说的。添加了一些关于它们的有趣细节
更新-2016年18月29日:
var exec = require('child_process').exec;
var request = require('request');
request('https://server_url', function (error, response, data) {
console.log("inside request");
exec(`osascript -e 'with timeout of 86400 seconds
tell app "System Events"
display dialog "` + data.pop_up_message + `" buttons {"OK", "Cancel"}
end tell
end timeout'
`, function(error, stdout, stderr){
console.log("inside exec");
});
});
inside request
inside exec
inside exec
inside exec
更新了流部分。正如Jaromanda X所建议的,error不是缓冲区,而是一个错误对象。每次调用
exec
的回调时,都会打印内部exec。。。不是每次调用exec时。。。。嗯,无论如何这只会发生一次-真奇怪。对话框多次显示。当我点击对话框按钮时,会打印“inside exec”(内部执行)更有趣的是,每次记录错误、标准输出和标准输出的值,看看发生了什么我也记录了错误值。但是它显示的是空字符串,那么stdout和stderr值呢?那么error不是流,是吗?我知道什么是标准,我知道什么是标准。。。但是错误呢?没有说任何关于每个流被调用的事情-事实上,没有涉及到任何流。。。只有一个错误对象和两个缓冲区您可能是对的。我仍在寻找确切的证据。我认为这是NodeJS自己发送的一条消息,这(我认为)是一条流。澄清这一点会很有趣。我不会冒险,错误对象现在更安全。谢谢你指出这一点!将更新。但不仅“inside exec”正在运行多次。该对话框也会显示多次。因此exec命令也运行了多次。