它是角度的实用程序库的一部分,但我将复制它自己的函数,以便于重现问题。问题是由于某种原因,输出中的项目少于数组中的项目。例如,数组长度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?
});
答案 0 :(得分:3)
在第一次迭代中,您将0
作为结果传递。
if(result) {
results.push(result);
}
将为false
(Boolean(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);
如果result
为0
,那么它就不会被推送。要检查是否已定义result
,请使用以下命令:
if(result !== undefined)
results.push(result);