JavaScript - Como detener la ejecución de un ciclo for en Javascript

 
Vista:
sin imagen de perfil
Val: 35
Ha aumentado 1 puesto en JavaScript (en relación al último mes)
Gráfica de JavaScript

Como detener la ejecución de un ciclo for en Javascript

Publicado por Jonathan (23 intervenciones) el 17/05/2022 01:02:48
Estimados estaría agradecido de su ayuda

Tengo el siguiente input de tipo archivos, donde cargo ciertas imágenes al sistema.

1
<input type="file" name="imagenes" id="imagenes" class="input-inputfile" accept=".jpg" multiple>

Estoy intentando limitar el ancho de subida de las imágenes a 1200px como mínimo. Para ello utilizo el siguiente script. Donde si subo de 1 a 5 imágenes, deseo evaluar su ancho, quiero que si una de las imágenes seleccionadas en el input tiene un ancho menor al establecido, se detenga el ciclo for y solo me muestre un alert indicando lo ocurrido. Pero actualmente me muestra 1 alert por cada imagen que no cumpla la condición, puse un break después del alert, pero me arroja el error Illegal break statement

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
$('.input-inputfile').change(function(){
            var imagen = document.getElementById("imagenes").files;
            var elemento = '.nombre-principal';
            if(this.files.length === 0){
                $(this).parent().children().children('.nombre-principal').html('Seleccione un archivo...');
                document.getElementById('imagenes').value = ''
            }else if(this.files.length === 1){
                var nombrearchivo = abreviar_texto(this.files[0].name,"16px Roboto",elemento)
                for (x = 0; x < imagen.length; x++) {
                    loadImage(imagen[x], function(result){
                        if(result < 1200){
                            alert('La imagen debe tener un ancho minimmo de 1200px')
                            $(this).parent().children().children('.nombre-principal').html('Seleccione un archivo...');
                            document.getElementById('imagenes').value = ''
                        }else{
                            $('.nombre-principal').html(nombrearchivo);
                        }
                    })
                }
            }else if(this.files.length > 1 && this.files.length <= 5){
                for (x = 0; x < imagen.length; x++) {
                    loadImage(imagen[x], function(result){
                        if(result < 1200){
                            alert('Las imagenes seleccionadas deben tener un ancho minimmo de 1200px')
                            break
                            // return false;
                            // $(this).parent().children().children('.nombre-principal').html('Seleccione un archivo...');
                            // document.getElementById('imagenes').value = ''
                        }else{
                            // $('.nombre-principal').html(nombrearchivo);
                        }
                    })
 
 
                }
                // $(this).parent().children().children('.nombre-principal').html('('+this.files.length+') Imagenes Seleccionadas');
            }else if(this.files.length > 5){
                document.getElementById('imagenes').value = ''
                $(this).parent().children().children('.nombre-principal').html('Seleccione un archivo...');
                alert('Puede seleccionar maximo 5 imagenes')
            }
        })
 
 
function loadImage(imagen, callback) {
        var _URL = window.URL || window.webkitURL;
        var img = new Image();
        let ancho,alto;
        img.src = _URL.createObjectURL(imagen);
        img.onload = function () {
            var ancho = img.width
            callback(ancho)
        }
    }
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro
Val: 1.448
Plata
Ha mantenido su posición en JavaScript (en relación al último mes)
Gráfica de JavaScript

Como detener la ejecución de un ciclo for en Javascript

Publicado por Alejandro (532 intervenciones) el 17/05/2022 01:19:19
  • Alejandro se encuentra ahora conectado en el
  • chat de PHP
El break, no pertenece al for, sino al callback de la función loadImage() por eso obtienes Illegal break statement.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 35
Ha aumentado 1 puesto en JavaScript (en relación al último mes)
Gráfica de JavaScript

Como detener la ejecución de un ciclo for en Javascript

Publicado por Jonathan (23 intervenciones) el 17/05/2022 01:24:57
Como podría solucionar dicho error ? , es la única traba que tengo en estos momentos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de 7aamin
Val: 9
Ha aumentado su posición en 6 puestos en JavaScript (en relación al último mes)
Gráfica de JavaScript

Como detener la ejecución de un ciclo for en Javascript

Publicado por 7aamin (79 intervenciones) el 17/05/2022 01:25:41
No me voy a poner a leer todo tu codigo proque sinceramente no tiene caso, ya que tu pregunta es directa:
"Como detener un loop en javascript"
Sencillamente existen dos palabras claves que son "continue" y "break"

break terminará el ciclo por completo sin importar el resto de elementos del objeto iterable y sin importar el resto de codigo que haya dentro del loop:

1
2
3
4
5
6
let arr = [1,2,3,4];
for (let i of arr) {
    console.log(i)
    if (i % 2 == 0) break;
    console.log('Mas codigo aqui...')
}

En el codigo de arriba, el ciclo termina con el numero 2, ya que el modulo es 0, omite todo el codigo restante dentro del ciclo y termina por completo el ciclo


la palabra reservada "continue" no termina el ciclo, lo que hace es ignorar la iteracion en caso que se cumpla una condicion:
1
2
3
4
5
6
let rr = [1,2,3,4];
for (let i of rr) {
    console.log(i)
    if (i % 2 == 0) continue;
    console.log('Mas codigo aqui...')
}

En este ejemplo, todo lo que este depues de "continue" sera ignorado para los elementos que cumplan la condicion
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 35
Ha aumentado 1 puesto en JavaScript (en relación al último mes)
Gráfica de JavaScript

Como detener la ejecución de un ciclo for en Javascript

Publicado por Jonathan (23 intervenciones) el 17/05/2022 01:34:48
En mi caso el break esta dentro del callback de la funcion loadImage, por esa razón me da error, entonces no se como poder detener el ciclo for, si es que el ancho de la imagen no cumple con el mínimo establecido
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de 7aamin
Val: 9
Ha aumentado su posición en 6 puestos en JavaScript (en relación al último mes)
Gráfica de JavaScript

Como detener la ejecución de un ciclo for en Javascript

Publicado por 7aamin (79 intervenciones) el 17/05/2022 02:31:28
Lo que puedes hacer es retornar que tu callback retorne un booleano, y que la funcion loadImage() retorne la propiedad "onload" que contendria el valor retornado por el callback..!
Hice un ejemplo para que sea facil de probar:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Objecto {
    constructor() {
        this.a = null;
        this.onload = null;
    }
}
 
const loadImage = (imagen, callback) => {
    let a = new Objecto();
    a.a = 12;
    a.onload = callback(imagen.length);
    return a.onload;
}
 
let arr = [1,2,3,4]
for (let i of arr) {
    let res = loadImage('jhj', r => {
        if (r == i) return true;
        else return false;
    }); console.log(res); if (res) break;
}

En tu caso seria asi:
1
2
3
4
5
6
7
8
function loadImage(imagen, callback) {
        var _URL = window.URL || window.webkitURL;
        var img = new Image();
        let ancho,alto;
        img.src = _URL.createObjectURL(imagen);
        img.onload = callback(img.width); //Aqui llamas directamente al callback sin necesidad de llamar una funcion anonima
        return img.onload; //Aqui retornas el valor que te dio el callback, que se ha guardado en onload
 }

Despues en el ciclo FOR tendrias que recibir esa funcion que te retorna loadImage():
1
2
3
4
5
6
for (x = 0; x < imagen.length; x++) {
    let res = loadImage(imagen[x], function(result) {
        if(result < 1200) return true;
        else return false;
    }); if (res) break;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar