我有以下代码,用ExtendScript编写,用于处理After Effects合成中的一系列图层:
for (var i=0; i < selectedLayers.length; i++) {
var layer = selectedLayers[i];
if (!layer.hasVideo || !layer.enabled) {
//Go for the next one
continue;
}
//Do stuff
}
如果某个元素未启用或其中没有视频,则循环应该跳过它;如果确实如此,则应该进行处理。
现在,如果没有满足"if"
检查的元素,但是如果一个元素完成了那个检查......那么循环就会在下一次迭代中停滞不前。那就是:想象一下i = 2处的元素是否没有视频。 “继续”被执行......然后,循环无限期地停留在i = 3并且永远不会结束。
为什么会这样?我认为“继续”正是在Javascript / Extendscript中跳过循环迭代的指令。发生了什么事?
编辑:根据要求,这是我的整个代码。也许我在其中一个嵌套的“if”中遗忘了一个大括号...但在这种情况下,代码如何在某些情况下起作用而在其他情况下不起作用?
var nombreDelPlugin="Denoiser II";
var rutaRender="/Users/paulj";
var activeItem = app.project.activeItem;
if ((activeItem == null) || !(activeItem instanceof CompItem)) {
alert("Please select or open a composition first.");
}
else {
var selectedLayers = activeItem.selectedLayers;
if (activeItem.selectedLayers.length == 0) {
alert("Please select at least one layer in the active comp first.");
}
else {
var comp = app.project.activeItem;
var width=comp.width;
var height=comp.height;
var par=comp.pixelAspect;
var fps=comp.frameRate;
var tempFolder = comp.parentFolder.items.addFolder(comp.name + " - Temp Comps");
var ClipsAnadidos=Array();
var nombresUsados={};
for (var i=0; i < selectedLayers.length; i++) {
alert("Mooo: " + i);
var layer = selectedLayers[i];
if (!layer.hasVideo || !layer.enabled) {
alert("Meeept: " + i);
continue;
}
/* if (!esFootage(layer)) {
alert("Meeept: " + i);
break;
}
*/
//¿Hemos renderizado ya este layer? Si es así, nos lo saltamos.
var original=layer.source;
if (inArray(original, ClipsAnadidos) > 0) {
continue;
}
ClipsAnadidos.push(original);
//¿Hay otra comp ya con este mismo nombre?
var vecesUsado=nombresUsados[original.name];
if (!vecesUsado) { vecesUsado=0; }
var nombre= original.name + "_" + vecesUsado;
nombresUsados[original.name]=vecesUsado + 1;
//Creamos la nueva comp con el clip dentro
var newcomp=app.project.items.addComp(nombre, width, height, par, original.duration, fps);
var newlayer=newcomp.layers.add(original, original.duration);
newcomp.parentFolder=tempFolder;
//Si la escala no es 100, usamos la de la comp original
if ((layer.scale.value[0] != 100) || (layer.scale.value[1] != 100)) {
newlayer.scale = layer.scale.value;
}
var denoise = newlayer.property("Effects").addProperty(nombreDelPlugin);
//Añadimos al render queue, y establecemos la ruta de salida
var rqi = app.project.renderQueue.items.add(newcomp);
var om = rqi.outputModule(1); // Assumes at least one output module
om.file=new File(rutaRender + "/" + original.name);
}
}
}
function esFootage(lay) {
if (lay.source instanceof FootageItem) {
//alert(lay.name + " es footage");
if (lay.source.mainSource instanceof SolidSource) { return false; }
else { return true; }
}
if (lay.source instanceof CompItem) {
return true;
}
else { return false; }
}
function inArray(v, arr) {
for (i=0; i < arr.length; i++) {
if (arr[i] == v) { return i; }
}
return -1;
}
答案 0 :(得分:0)
这对我来说很好用:
var selectedLayers = [
{hasVideo: true, enabled: true},
{hasVideo: true, enabled: true},
{hasVideo: true, enabled: false},
{hasVideo: true, enabled: true},
{hasVideo: false, enabled: true}
];
for (var i=0; i < selectedLayers.length; i++) {
var layer = selectedLayers[i];
if (!layer.hasVideo || !layer.enabled) {
//Go for the next one
continue;
}
//Do stuff
console.log(i);
}
它会跳过2
和4
并输出:
0
1
3
如果你在循环中有一个循环,那么内部i
可能正在被重置,在这种情况下你必须在循环之外定义它。