2017-02-17 61 views
0

这是一个实用工具库角的一部分,但我会在这里只复制功能是独自可以很容易地重现该问题。问题是,由于某种原因,存在输出1以下项比有在数组中。例如,数组长度为1000时,只会在结果数组中输出999个元素。为什么?同步迭代器跳过第一个项目阵列

功能:

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

}; 

的摄制:

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

初始化为0阵列带来的1000个项目,而不是-1 – andrepaulo

回答

3

在你逝去的0作为结果的第一次迭代。

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

falseBoolean(0)false),以便0从不加入到results阵列。


对于result你可以比较一下对undefined

if (result !== undefined) 

error,可以使用针对null宽松相比,它处理nullundefined

if (error != null) 
+0

,所以我应该检查不确定的,而不是'结果= undefined'请添加到您的答案(对于未来读者参考)。也为错误,有必要检查null和不确定的,因为它是不可能有结果,并没有旁的错误调用,所以'[null,未定义] .indexOf(错误)!= -1'应该是检查错误。 – r3wt

+0

一旦添加了额外的信息,我就接受你的答案。 – r3wt

+0

我误解了这个问题。我认为这个功能来自第三方库。 –

2

这不是推动在这条线上,当我是0时:

if(result) { 
1

0在javascript中是falsy。这样做的时候:

if(result) 
    results.push(result); 

如果result0那么它不会推。要检查是否result定义使用本:

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