我正在尝试从给定的开始日期开始遍历日期。我陷入了围绕nodeJS和异步编程的永恒问题:
getdates('2018-08-01', function(result) {
console.log(result);
})
function getdates (startdate, callback) {
let now = new Date();
let start = new Date(startdate);
let Dates = [];
do {
Dates.push(start);
start.setDate(start.getDate() + 1);
}
while(now.getDate() != start.getDate())
callback(Dates);
}
其结果是:
[ 2018-08-07T00:00:00.000Z, 2018-08-07T00:00:00.000Z, 2018-08-07T00:00:00.000Z, 2018-08-07T00:00:00.000Z, 2018-08-07T00:00:00.000Z, 2018-08-07T00:00:00.000Z ]
只有今天日期的数组。
我知道这是由于NodeJS的特性引起的,但是我该如何解决或正确地解决呢?
最好的问候, 基督徒
答案 0 :(得分:1)
它与异步编程无关,而且我也不认为“永恒”。
您正在创建1个日期对象并将其推送。因此,数组项是指向同一对象的。
这可能是一种粗略的方法:
getdates('2018-08-01', function(result) {
console.log(result);
})
function getdates (startdate, callback) {
const now = new Date();
const start = new Date(startdate);
let Dates = [];
for(let i=0;i<(now.getDate() - start.getDate());i++ ){
const d = new Date(startdate);
d.setDate(d.getDate() + i);
Dates.push(d);
}
callback(Dates);
}
答案 1 :(得分:1)
这与任何Node.js或异步天堂无关。在Java,C#和大多数其他语言中也会发生同样的情况。
问题出在以下行:Dates.push(start);
。
start
是一个对象,因此它包含引用。通过调用“ push”,您可以将引用复制到数组的下一个字段中。
最后,您得到的数组充满了对同一对象的引用,因此它们都具有相同的值-您为该对象设置的最后一个值。
这将正常工作
getdates('2018-08-01', function(result) {
console.log(result);
})
function getdates (startdate, callback) {
let now = new Date();
let start = new Date(startdate);
let Dates = [];
do {
Dates.push(new Date(start));
start.setDate(start.getDate() + 1);
}
while(now.getDate() != start.getDate())
callback(Dates);
}
也不再使用回调(如果没有必要的话),它只会使代码的可读性降低,并且调试起来也更加困难。
您可以只返回值-
const dates = getdates('2018-08-01');
console.log(dates);
function getdates (startdate, callback) {
let now = new Date();
let start = new Date(startdate);
let Dates = [];
do {
Dates.push(new Date(start));
start.setDate(start.getDate() + 1);
}
while(now.getDate() != start.getDate())
return Dates;
}