因此,我正在用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));
});
};刮的很好,我从网站上得到了一系列的控制台转储。然而,它们的时间戳都是相同的。这些回调显然不是同时完成的(有时在回调响应之间长达几秒钟)--那么为什么它们会被时间戳到相同的毫秒呢?
我是不是漏掉了函数在这里的作用域?在我看来,即使所有回调都引用了Date.getTime()的同一个实例,控制台转储也应该在单个回调返回时冻结时间戳。
我能想到的唯一解释是,Date.getTime()值是在创建回调时存储的,而不是在回调实际启动时更新的。
有人能在这里亮点光吗?
发布于 2013-09-17 09:01:25
如果您需要当前时间戳,而不是固定日期的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实现)。
https://stackoverflow.com/questions/18844971
复制相似问题