我正在尝试遍历给定开始日期的日期。我被围绕着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的性质,但我如何才能解决这个问题或以正确的方式来做呢?
致以最好的问候,克里斯蒂安
发布于 2018-08-07 20:08:21
这与任何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;
}
发布于 2018-08-07 20:08:11
它与异步编程没有任何关系,我至少不认为它是“永恒的”。
您正在创建1个date对象并将其推送。所以数组的项是对同一对象的引用。
这可能是一种粗糙的方法:
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);
}https://stackoverflow.com/questions/51726280
复制相似问题