1

そのため、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));
        });
};

スクレイプは正常に機能し、Web サイトから一連のコンソール ダンプを取得します。ただし、それらすべてのタイムスタンプは同一です。コールバックは明らかに同時に終了していません (コールバック応答の間に最大数秒かかる場合があります)。

ここで関数のスコープについて何か不足していますか? 私が見たように、すべてのコールバックが Date.getTime() の同じインスタンスを参照している場合でも、コンソール ダンプは、個々のコールバックが戻るときにタイムスタンプを凍結する必要があります。

私が考えることができる唯一の説明は、コールバックが作成されたときに Date.getTime() 値が保存され、実際に起動したときに更新されないということです。

誰かがここで光を当てることができますか?

4

1 に答える 1

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()orを使用しないでくださいvar myTempDate = new Date(); return myTempDate.getTime()。新しいオブジェクトが作成されるためです。それらは必要なく、アプリケーションの速度を低下させる可能性さえあります (GC の実装によって異なります)。

于 2013-09-17T09:01:25.067 に答える