首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NodeJS和异步编程

NodeJS和异步编程
EN

Stack Overflow用户
提问于 2018-08-07 19:59:57
回答 2查看 98关注 0票数 0

我正在尝试遍历给定开始日期的日期。我被围绕着nodeJS和异步编程的永恒问题所困扰:

代码语言:javascript
复制
    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);         
    }

这样做的结果是:

代码语言:javascript
复制
[ 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的性质,但我如何才能解决这个问题或以正确的方式来做呢?

致以最好的问候,克里斯蒂安

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-07 20:08:21

这与任何Node.js或异步范例无关。在Java、C#和大多数其他语言中也会发生同样的事情。

问题出在这一行:Dates.push(start);

start是一个对象,因此它持有引用。通过调用"push“,您可以将引用复制到数组中的下一个字段。

您最终得到的数组充满了对同一对象的引用,因此所有这些引用都具有相同的值-您为该对象设置的最后一个值。

这将正常工作

代码语言:javascript
复制
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);         
}

此外,不再使用回调(如果不是必要的话),这只会降低代码的可读性,并且更难调试。

你可以直接返回值-

代码语言:javascript
复制
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;
}

票数 1
EN

Stack Overflow用户

发布于 2018-08-07 20:08:11

它与异步编程没有任何关系,我至少不认为它是“永恒的”。

您正在创建1个date对象并将其推送。所以数组的项是对同一对象的引用。

这可能是一种粗糙的方法:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51726280

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档