質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

1回答

469閲覧

【node.js】do while ループが終わったタイミングでreturnしたいが、一順目でreturnされてしまう。

tonkotsu_ramen

総合スコア6

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2021/07/25 06:19

【やろうとしていること】
スクレイピング処理(Node.js)を実装しており、「前月へ」のリンクがあったら、そのリンクを踏んでスクレイピングしていくといった流れです。
まずは、URLを一通り取得する処理を実装していますが、do whileでループさせて取得したURLbeforeLastMonthurl
を配列で返り値として返してやろうとしていますが、うまく値が渡らない状況です。
やりたいことは、do whileのループが全て終了し、値を取り切ったタイミングでretuenしたい。
が、現状1巡目でreturnされてしまう。

js

1async searchLastMonth(Id) { 2 const beforeLastMonthurl = []; 3 beforeLastMonthurl.push( 4 `https://hoge.com/id=${liverId}` 5 ); 6 let pageBoolean = true; 7 do { 8 const lastMonthLink = await this.page.$("a.prev");// 前月のリンクの有無 あればtrue 9 if (lastMonthLink) { 10 console.log("先月もあるよ"); 11 12 const groupLinks = await this.page.$$eval( 13 "a.prev", 14 (hrefs) => 15 hrefs.map((a) => { 16 return a.href; 17 }) 18 ); 19 20 beforeLastMonthurl.push(String(groupLinks)); 21 await this.page.goto(String(groupLinks)); 22 pageBoolean = true; 23 } else { 24 console.log("先月のデータはないよ"); 25 pageBoolean = false; 26 return beforeLastMonthurl; 27 } 28 } while (pageBoolean == false); 29 30 }

js

1// 関数呼び出し 2// 抜粋 3 const Page = new Page(browser, page); 4 console.log(await Page.searchLastMonth(Id); 5// ここで`beforeLastMonthurl`を受け取りたい

【現在の状況】
ページ遷移自体はできていて、前月リンクがあれば遷移、なければ終了はしています。
ただ、urlを入れたbeforeLastMonthurlが渡りません。

【わからないこと】
do while のどのタイミングでreturnの処理を書いたら良いかわからない。
試しに各処理の最後にreturn beforeLastMonthurlと書いてみたが、うまく渡らない状況です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

} else {
console.log("先月のデータはないよ"); pageBoolean = false; return beforeLastMonthurl; } } while (pageBoolean == false);

}

ここんところ、
} else {
console.log("先月のデータはないよ");
pageBoolean = false;
break;
}
} while (pageBoolean == false);
return beforeLastMonthurl;
}

ではどーなるでしょうか

ああ、一周目で戻ってしまうってなら、
if (lastMonthLink) {
これは最初にfalseになってるってことですな。
そこんとこをみなおすとかしてみれば

投稿2021/07/25 08:10

編集2021/07/25 08:14
y_waiwai

総合スコア87800

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問