所以,我正在Node中编写一个页面刮板,并且在一组回调中从Date.getTime获得奇怪的行为。
function projectScrape(urlList){
urlList.forEach(function(frag){
request(frag.url, (function(frag){
return function(err, resp, body){
if(err) console.log('error: ' + err);
project$ = cheerio.load(body);
var tempRecord = {
name: frag.name,
funding: project$('span.monthly_funding_goal_percentage').text($
subs: project$('span.number_of_subscribers').text(),
timestamp: myDate.getTime()
};
console.log(tempRecord);
}
})(frag));
});
};
scrape工作正常,我从网站上获得了一系列控制台转储。但是,所有这些时间戳都是相同的。回调显然没有在同一时间完成(有时回调响应之间有几秒钟) - 那么为什么它们的时间戳加到相同的毫秒级呢?
我在这里错过了有关函数范围的内容吗?在我看来,即使所有的回调都引用了相同的Date.getTime()实例,控制台转储也应该将时间戳冻结到各个回调返回的时间。
我能想到的唯一解释是,在创建回调时存储Date.getTime()值,而在实际触发时不会更新。
有人能在这里说清楚吗?
答案 0 :(得分:2)
如果您想要固定日期的当前时间戳,请使用Date.now()
,而不是.getTime()
。除非您以任何方式修改myDate
,否则它将始终引用相同的时间和日期,因此.getTime()
将始终返回相同的值:
var tempRecord = {
name: frag.name,
funding: project$('span.monthly_funding_goal_percentage').text(/* ... */),
subs: project$('span.number_of_subscribers').text(),
timestamp: Date.now() // <---------
};
请勿使用(new Date()).getTime()
或var myTempDate = new Date(); return myTempDate.getTime()
,因为这些会创建新对象。您不需要它们,甚至可能会降低您的应用程序速度(取决于GC实现)。