2013-09-17 4 views
0

Итак, я пишу скребок страницы в узле и получаю нечетное поведение от Date.getTime в наборе обратных вызовов.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() сохраняется, когда обратные вызовы создаются и не обновляются, когда они фактически запускаются.

Может ли кто-нибудь пролить свет здесь?

+0

перед установкой значения timestamp do var myDate = new Date(); – sachin

+0

Как вы инициализировали 'myDate'? Если это определенный объект Date, указывающий на определенную временную метку, то, конечно, это не изменяется. – CBroe

+0

@DanHeidel timestamp: new Date(). GetTime() – sachin

ответ

1

Используйте 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).

+0

Работал отлично, спасибо! Рад видеть, что это было что-то мирское. – DanHeidel

Смежные вопросы