目前我使用如下的模式来读取一系列文件的前3个字符:
var files = e.dataTransfer.files;
for (var i = 0, f; f = files[i]; i++) {
var fr = new FileReader();
fr.onload = function(e) {
var first_three_chars = e.target.result.substr(0,3);
}
fr.readAsText(f);
}
Run Code Online (Sandbox Code Playgroud)
麻烦的是我只对文件的前3个字符感兴趣,而这个方法读取整个文件,浪费了大量的内存和时间.如何快速迭代文件,只需快速查看第一个字符?
编辑:slice()是答案,谢谢sshen.我是这样做的:
var files = e.dataTransfer.files;
for (var i = 0, f; f = files[i]; i++) {
var fr = new FileReader();
fr.onloadend = function(e) {
if (e.target.readyState == FileReader.DONE) {
var first_three_chars = e.target.result;
}
};
var blob = f.slice(0, 3);
fr.readAsText(blob);
}
Run Code Online (Sandbox Code Playgroud) 我正在使用Open3的popen3方法来启动一个以类似控制台/ REPL方式运行的进程,以反复接受输入和返回输出.
我可以打开进程,发送输入,并接收输出就好了,代码如下:
Open3.popen3("console_REPL_process") do |stdin, stdout, stderr, wait_thr|
stdin.puts "a string of input"
stdin.close_write
stdout.each_line { |line| puts line } #successfully prints all the output
end
Run Code Online (Sandbox Code Playgroud)
我想连续多次这样做,而不需要重新打开过程,因为启动需要很长时间.
我知道我必须关闭stdin以便stdout返回..但我不知道的是,我如何重新打开'stdin以便我可以写更多输入?
理想情况下,我想做这样的事情:
Open3.popen3("console_REPL_process") do |stdin, stdout, stderr, wait_thr|
stdin.puts "a string of input"
stdin.close_write
stdout.each_line { |line| puts line }
stdin.reopen_somehow()
stdin.puts "another string of input"
stdin.close_write
stdout.each_line { |line| puts line }
# etc..
end
Run Code Online (Sandbox Code Playgroud)
感谢pmoo的回答,我能够使用PTY
和设计一个解决方案,并expect
期望当进程准备好输入时进程返回的提示字符串,如下所示:
PTY.spawn("console_REPL_process") do |output, input| …
Run Code Online (Sandbox Code Playgroud) 我正在根据迈克博斯托克的Zoomable Sunburst例子进行一场森伯斯特战争.
我希望能够使用全新的JSON(具有相同的结构但不同的'size'值)更改基础数据,并让sunburst为转换设置动画以反映更新的数据.
如果我使用.data()更改路径元素的数据,然后尝试以下列方式更新:
path.data(partition.nodes(transformed_json))
.transition()
.duration(750)
.attrTween("d", arcTween(transformed_json));
Run Code Online (Sandbox Code Playgroud)
(..几乎与点击fn完全相同的代码)
function click(d) {
path.transition()
.duration(750)
.attrTween("d", arcTween(d));
}
Run Code Online (Sandbox Code Playgroud)
..我发现sunburst确实正确地改变了以反映新数据,但它会卡入到位而不是平滑过渡,就像放大时一样.
http://jsfiddle.net/jTV2y/ < - 这是一个隔离问题的jsfiddle(点击'Run'后转换发生一秒钟)
我猜我需要创建一个不同的arcTween()fn,但我的d3理解还没有.非常感谢!
在Firefox中,以下代码在主浏览器线程中正常运行时正常工作 -
var fr = new FileReader();
Run Code Online (Sandbox Code Playgroud)
..但是当从Web worker运行时,会抛出以下错误:
FileReader is not defined
Run Code Online (Sandbox Code Playgroud)
相同的代码在Chrome和Safari中运行良好.
在Firefox中支持Web worker的FileReader的任何建议?
javascript ×3
filereader ×2
d3.js ×1
fileapi ×1
firefox ×1
html5 ×1
popen3 ×1
ruby ×1
web-worker ×1