我正在使用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'
被多次打印。
这个问题的原因是什么?我该怎么解决这个问题呢。
答案 0 :(得分:0)
内部函数是一个连接到2个流的回调:stdout
和stderr
。第三个参数是一个错误对象,如果子进程失败或超时,通常包含一些内容(请参阅:documentation)。
每当你执行某些操作时,他的输出将在一段时间后通过其中一个发送消息而到达。它可能发生在不久之后,或很长一段时间之后。此外,它可能是一个相当小或大的输出,因此这将根据执行的内容进入数据块。 "引擎盖"可以更容易地在C / C ++透视图中看到stdout
和stderr
。
让我们假设您编写了一个C程序,通过写入stdout
每隔5秒打印到控制台,然后用NodeJS模块调用它。
您的console.log
会在检测到通过其中一个流发送的消息后立即打印出来。在这种特定情况下,它将每5秒打印一次。
只是一张小图片,因为关于什么流以及它们如何工作可能还有很多话要说。 This answer添加了一些有趣的细节。
更新 - 2016年2月28日:
更新了流部分。像Jaromanda X建议的那样,错误不是缓冲区而是错误对象。