Node有一个VM module,可以在新的上下文中运行任意JavaScript代码。
我想做的是找到一种方法来阻止此代码在回调函数上执行,以可靠的方式上下文无法停止。
这是一个棘手的样本,我一直试图找到解决方案。
<script>
$(document).ready(function () {
if (window.File && window.FileList && window.FileReader) {
$("#files").on("change", function (e) {
var files = e.target.files,
filesLength = files.length;
var count = 0;
for (var n = 0; n < filesLength; n = n + 3)
// Insert a row for 3 image cols
$("<div class=\"row\" id=\"addColHere0\"></div>").insertAfter("#whatup");
for (var i = 0; i < filesLength; i++) {
var f = files[i]
var fileReader = new FileReader();
fileReader.onload = (function (e) {
var file = e.target;
// get the last DIV which ID starts with ^= "klon"
var $div = $('div[id^="addColHere"]:last');
// Read the Number from that DIV's ID (i.e: 3 from "klon3")
// And increment that number by 1
var num = parseInt($div.prop("id").match(/\d+/g), 10) + 1;
var changedId = "#addColHere" + (num - 1);
// Clone it and assign the new ID (i.e: from num 4 to ID "klon4")
var $klon = $div.clone().prop('id', 'klon' + num);
// >>> Append $klon wherever you want
// Insert cols inside row
$(changedId.value).append("<div id=\"breakThis\" class=\" col-sm-4 col-xs-6 toBeRemove\" style=\"padding:0 0px;\">" +
"<div class=\"col-sm-12 camera-style-small\" align=\"left\" >" +
"<img style=\" width:100%; height:100%; z-index:102;\" class=\"imageThumb\" src=\"" + e.target.result + "\" title=\"" + file.name + "\"/>" +
"<span class=\"remove icon-delete_icon create-deleteStyle\"></span>" +
"</div>" +
"</div>");
i = i + 1;
$(".remove").click(function () {
// $(this).parent(".camera-style-small").remove();
$(this).closest(".toBeRemove").remove();
});
});
fileReader.readAsDataURL(f);
}
});
} else {
alert("Sorry, but your browser doesn't support this function. Please update or try another browser.")
}
});
</script>
因为try / catch语句捕获了任何异常,所以只抛出异常。如果没有从回调中停止脚本,代码就会进入一个永久运行的虚拟循环(好吧,直到它达到设置的任何超时,直到那时浪费CPU周期)。
'use strict';
var vm = require('vm');
var src = '(' + (function(kill) {
try {
kill();
}
catch (ex) {}
// Can this be prevented?
while (true) {
// Nothing.
}
}) + ')';
var script = new vm.Script(src);
var func = script.runInNewContext();
func(function() {
console.log('This should somehow stop that VM from running.');
});
VM功能不是我想要的,因为我想停止脚本命令。我可以将此代码移动到另一个进程中运行并终止该进程,但这会增加很多开销。
我愿意接受这方面的创造性解决方案。也许使用Node's Debug objects的东西?
答案 0 :(得分:1)
一种可能的解决方案是在子进程中执行代码,如果需要,可以在那里尽早终止子进程。如果存在无限循环的可能性,你可能想要这样做,以避免使主脚本的事件循环挨饿。