Es parte de una biblioteca de utilidades para angular, pero copiaré aquí solo la función para facilitar la reproducción del problema. El problema es que, por alguna razón, hay 1 elemento menos en la salida que en la matriz. por ejemplo, la longitud de la matriz de 1000 solo genera 999 elementos en la matriz de resultados. ¿por qué?

la función:

var sync = function( items, eachFn, callbackFn ){

    var results = [], 
        errors = [];

    function next(error,result){
        if(error) {
        errors.push(error);
    }
        if(result) {
        results.push(result);
    }
        if(items.length == 0){
            return callbackFn(errors,results);
        }else{
            eachFn(items.shift(),next);
        }
    };

    next();

};

la repro:

var array = new Array(1000).fill(0);// 1000 item array

var i = -1;

sync(array,function(item,next){
    i++;
    next(null,i);
},function(errors,results){
    console.log(results.length === 1000);// but its 999, why?
});

Ejemplo de jsfiddle

0
r3wt 17 feb. 2017 a las 03:38

3 respuestas

La mejor respuesta

En la primera iteración, pasará 0 como resultado.

if(result) {
    results.push(result);
}

Será false (Boolean(0) es false) por lo que 0 nunca se agrega a la matriz results.


Para result puedes compararlo con undefined:

if (result !== undefined)

Para error, puede usar una comparación flexible con null, que maneja null y undefined:

if (error != null)
3
Felix Kling 17 feb. 2017 a las 01:10

0 es falso en javascript. Así al hacer:

if(result)
    results.push(result);

Si result es 0, entonces no será empujado. Para verificar si result está definido, use esto:

if(result !== undefined)
    results.push(result);
1
ibrahim mahrir 17 feb. 2017 a las 00:54

No está presionando en esta línea cuando tengo 0:

 if(result) {
2
jeff carey 17 feb. 2017 a las 00:51