非同期のruipgil/scraperjs関数を使用してスクレーパーを作成しようとしました。しかし、私はそれをループの中に入れると、詰まって動作しません。私はNodeと、非同期プログラミングのアイデアを知っていますので、私に同行してください。whileループ(scraperjs)内で使用すると非同期関数が詰まった
だから、私はこのコードを持っている:
let scraperjs = require('scraperjs');
// scraper function
function scrape(pageURI, callback) {
console.log('checkpoint 2'); // checkpoint
scraperjs.StaticScraper.create(pageURI).scrape(function($) {
console.log('checkpoint 3'); // checkpoint
return $("div").map(function() {
return $(this).text();
}).get();
}).then(function(sometext) {
callback(sometext);
});
}
// loop function
function testloop() {
let finished = false;
let processed = false;
while (!finished) {
if (!processed) {
console.log('checkpoint 1'); // checkpoint
scrape('https://www.google.com/', (sometext) => {
console.log('checkpoint 4', sometext); // checkpoint
finished = true;
});
processed = true;
}
}
}
// non loop function
function testnonloop() {
console.log('checkpoint 1'); // checkpoint
scrape('https://www.google.com/', (sometext) => {
console.log('checkpoint 4', sometext); // checkpoint
});
}
私は完全な4つのチェックポイントの出力を期待して、両方の機能を派遣しようとしました。しかし、不思議なことに、ループのあるものはチェックポイント2で詰まってしまい、決して進まない。 [私もコールバックスタイルの代わりに約束を使ってみましたが、同じ出力です。]
どこが間違っていましたか?
ので、基本的に、私は右だ「ターミネーターがasynchronnously悪いながら呼び出しますか」?キューが空になるまで非同期タスクのキューを実行してから消去したい場合、どうすればよいですか? – shrotavre
自分の答えを更新し、ループ中に非同期コードを実行させるサンプルを追加しました。 – ncardeli