javascript - child_process exec 命令被多次执行

标签 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(`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

此处 'inside request' 仅打印一次。但是 'inside exec' 被多次打印。 这个问题是什么原因。我该如何解决这个问题。

最佳答案

内部函数是连接到 2 个流的回调:stdoutstderr。第三个参数是一个错误对象,如果子进程失败或超时,它通常包含一些内容(参见:documentation)。

每当你执行某事时,他的输出将在一段时间后通过其中一个发送消息到达。它可以在不久之后发生,也可以在很长一段时间之后发生。此外,它可以是一个相当小或很大的输出,因此这将根据执行的内容进入数据 block 。 stdoutstderr 的“幕后”在 C/C++ 视角下更容易可视化。

假设您编写了一个 C 程序,它通过写入 stdout 每 5 秒向控制台打印一次,然后您使用 NodeJS 模块调用它。

您的 console.log 会在检测到通过其中一个流发送的消息时立即打印一些内容。在这种特定情况下,它将每 5 秒打印一次。

只是一张小图,因为关于流是什么以及它们如何工作还有很多要说的。 This answer添加了一些关于它们的有趣细节。


更新 - 29/18/2016:

更新了流部分。正如 Jaromanda X 所建议的那样,错误不是缓冲区而是错误对象。

关于javascript - child_process exec 命令被多次执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39198715/

相关文章:

javascript - 用户单击复选框后保持上下文菜单打开?

javascript - 如何获取 Map 函数的下一个元素?

javascript - 如何测试另一个函数内的函数调用? Jest

javascript - Opentip 样式不起作用

javascript - Electron - 从 BrowserWindow 的 loadUrl() 中检索 HTTP 响应头

node.js - 如何从 Visual Studio 代码调试 child_process fork 进程

electron - 是否有可能在 Electron 桌面应用程序框架中使用 ANT UI 设计?

node.js - Electron iframe : require is not defined

node.js - 使用 NodeJS 创建 CLI - 将变量传递给 exec linux 命令

node.js - 检查子进程是否正在运行