NodeJS和异步编程

时间:2018-08-07 11:59:57

标签: node.js asynchronous

我正在尝试从给定的开始日期开始遍历日期。我陷入了围绕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的特性引起的,但是我该如何解决或正确地解决呢?

最好的问候, 基督徒

2 个答案:

答案 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;
}