child_process exec命令多次执行

时间:2016-08-29 04:56:47

标签: javascript electron child-process

我正在使用exec()运行终端命令来显示电子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'被多次打印。 这个问题的原因是什么?我该怎么解决这个问题呢。

1 个答案:

答案 0 :(得分:0)

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

每当你执行某些操作时,他的输出将在一段时间后通过其中一个发送消息而到达。它可能发生在不久之后,或很长一段时间之后。此外,它可能是一个相当小或大的输出,因此这将根据执行的内容进入数据块。 "引擎盖"可以更容易地在C / C ++透视图中看到stdoutstderr

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

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

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

更新 - 2016年2月28日:

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