同步迭代器跳过数组中的第一项

时间:2017-02-17 00:38:13

标签: javascript

它是角度的实用程序库的一部分,但我将复制它自己的函数,以便于重现问题。问题是由于某种原因,输出中的项目少于数组中的项目。例如,数组长度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();

};

the 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

3 个答案:

答案 0 :(得分:3)

在第一次迭代中,您将0作为结果传递。

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

将为falseBoolean(0)false),因此永远不会将0添加到results数组中。

对于result,您只需将其与undefined进行比较:

if (result !== undefined)

对于error,您可以对null使用松散比较,null处理undefined if (error != null)

 if(result) {

答案 1 :(得分:2)

当我0时,它没有推动这一行:

WITH storage as (
    SELECT
        sum(points) as points,
        sum(rewards) as rewards,
        team_id FROM B
    WHERE team_id IS NOT NULL
    GROUP BY user_id, team_id
)

UPDATE A
SET
   points = (
      SELECT points FROM storage WHERE 
      storage.team_id = A.team_id AND storage.user_id = A.user_id
),
   rewards = (
      SELECT rewards FROM storage WHERE
      storage.team_id = A.team_id AND storage.user_id = A.user_id
)
WHERE user_id = 1;

答案 2 :(得分:1)

0在javascript中是假的。因此,当做:

if(result)
    results.push(result);

如果result0,那么它就不会被推送。要检查是否已定义result,请使用以下命令:

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