PhantomJS标准输入的事件监听器

8

能否为PhantomJS的system.stdin事件设置事件监听器?

以下是一个示例,其中PhantomJS可以从标准输入读取数据,但在等待输入时会停止所有操作:

var system = require('system');

system.stdout.writeLine('waiting for user input...');
var input = system.stdin.readLine();
// anything down here won't execute until input has been received

理想的解决方案类似于 nodejs 的 process.stdin.on()

PhantomJS 似乎没有提供任何方法来实现这一点,但仍然可能是可行的。

我在考虑是否可以使用 fs.open() 并轮询流以进行更改,但我无法弄清楚如何为 stdio/tty 打开正确的文件,或者这是否与我尝试做的事情相关。

我正在使用 Debian 6 上的 PhantomJS 版本 1.9.0。


我已经在这里发布了请求:https://github.com/ariya/phantomjs/issues/11319 - badunk
顺便说一句,我没有花太多时间来解决这个问题。我使用了一个Web服务器与PhantomJS进行通信,这实际上比stdio更好地满足了我的需求。 - Chris J
三年后,phantomjs 的这个功能请求仍然在这里开放:https://github.com/ariya/phantomjs/issues/11319 - morten.c
2个回答

4

我不确定这是否是正确的方法,甚至不确定它在性能上是否很好,但是它可以正常工作,除了必须首先进行第一个STDIN请求以初始化程序。

test.js

console.log('initialising program, waiting for user input');

var stdin = require('fs').open('/dev/stdin', 'r');

setInterval(function () {
    var line = stdin.readLine();
    if (line) { console.log('>>', line); }
}, 100);

console.log('logic running async');

然后你可以创建一个FIFO管道并将其附加到进程。
$ mkfifo PIPE
$ phantomjs test.js < PIPE

然后在另一个终端窗口中,你可以执行以下操作:

echo hello world > PIPE

输出结果将会是:
initialising program
logic running async
>> hello world

我不认为这个方法适用于Windows机器。而且,由于它使用一个预定义的时间间隔来捕获用户的输入,性能可能会非常糟糕。但是,如果我想要调试一个程序,这是一种快速简便的方法,可以从中评估输入。


0

根据问题,该功能目前不可用。

尽管stdin可能是更快的选择,但我还是选择了Web服务器方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接