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<<代码> >代码> STDRR 可以在C/C++透视图中更容易可视化。 假设您编写了一个C程序,通过写入
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命令也运行了多次。