2017-02-17 1 views
0

es ist ein Teil einer Dienstprogramm-Bibliothek für eckig, aber ich werde nur die Funktion selbst hier kopieren, um es einfach zu machen, das Problem zu reproduzieren. Das Problem besteht darin, dass aus irgendeinem Grund 1 Element in der Ausgabe weniger vorhanden ist als im Array. Zum Beispiel gibt die Array-Länge von 1000 nur 999 Elemente im Ergebnis-Array aus. Warum?synchronen Iterator überspringt erstes Element in Array

die Funktion:

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(); 

}; 

die 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? 
}); 

jsfiddle example

+0

Initialisieren des Array mit 0 bringt 1000 Elemente statt -1 – andrepaulo

Antwort

3

In der ersten Iteration Sie 0 als Ergebnis sind vorbei.

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

wird false (Boolean(0) ist false) so 0 wird nie auf die results Array hinzugefügt.


Für result Sie können es einfach vergleichen gegen undefined:

if (result !== undefined) 

Für error können Sie lose Vergleich gegen null verwenden, die nullundundefined Griffe:

if (error != null) 
+0

so sollte ich für nicht definierte statt 'Ergebnis überprüfen = undefined' bitte diese (für zukünftige auf Ihre Antwort hinzufügen Leser zu verweisen). auch für den Fehler ist es notwendig, sowohl auf null als auch auf undefiniert zu prüfen, da es unmöglich wäre, als nächstes mit result und ohne Fehler aufzurufen, also sollte '[null, undefined] .indexOf (error)! = -1' die Prüfung sein der Fehler. – r3wt

+0

Sobald Sie die zusätzlichen Informationen hinzufügen, werde ich Ihre Antwort akzeptieren. – r3wt

+0

Ich habe die Frage missverstanden. Ich dachte, die Funktion stammte von einer Drittanbieter-Bibliothek. –

2

Es drängt nicht auf dieser Linie, wenn i 0:

if(result) { 
1

0 ist falsy in Javascript. Wenn also tun:

if(result) 
    results.push(result); 

wenn result0 ist, dann wird es nicht geschoben bekommen. Um zu überprüfen, ob result ist diese definiert Verwendung:

if(result !== undefined) 
    results.push(result); 
Verwandte Themen