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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

JavaScript

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

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

Q&A

3回答

1291閲覧

async/await が上手く動作しない

callmichael

総合スコア71

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

JavaScript

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

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

0グッド

1クリップ

投稿2019/06/23 03:33

やっていること

requestとcheerioを使ってWebサイトから特定のデータを抽出するコードを書いています。

困っていること

理想の出力は下記の通りです。

start url1 url2 url3 [url1, url2, url3]

実際の出力は下記のようになってしまいます。

start [] url1 url2 url3

awaitを待って配列を出力したい所で、先にconsole.log(urls)が呼ばれてしまっているようです。

コード

javascript

1export const someFunction = async () => { 2 console.log('start'); 3 let urls: string[] = []; 4 try { 5 await request.get( 6 "https://example.com", 7 async (error, response, data) => { 8 const $ = await cheerio.load(data); 9 $(".some-class").each((index, item) => { 10 const url = $(item).attr("href"); 11 console.log(url); 12 urls.push(url); 13 }); 14 } 15 ); 16 } catch (e) { 17 console.log(e); 18 } 19 console.log(urls); 20};

eachを使っている部分が影響しているのでしょうか。
色々と調査してみましたが原因が分からず、考えられる理由があれば教えていただけないでしょうか。
よろしくお願いいたします。

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

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

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

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

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

guest

回答3

0

これでどうやろか

javascript

1export const someFunction = async () => { 2 console.log('start'); 3 let urls: string[] = []; 4 try { 5 await Promise((res, rej) => { 6 request.get( 7 "https://example.com", 8 async (error, response, data) => { 9 const $ = await cheerio.load(data); 10 11 12 $(".some-class").each((index, item) => { 13 const url = $(item).attr("href"); 14 console.log(url); 15 urls.push(url); 16 }); 17 18 res() 19 } 20 ); 21 }) 22 } catch (e) { 23 console.log(e); 24 } 25 console.log(urls); 26};

投稿2020/10/07 05:31

編集2020/10/07 05:33
Katsuyuki_Oeda

総合スコア2

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

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

0

原因はawait request.getの外側に
console.log(urls)が記述されているからです。

以下のコードのようにawait request内に記述すれば
想定どおりに動作します。

js

1const request = require('request') 2const cheerio = require('cheerio') 3const url = 'https://eiga.com/now/all/rank/' 4 5const someFunction = async() => { 6 console.log('start') 7 const urls = [] 8 await request(url, 9 async (e, response, body) => { 10 try { 11 const $ = cheerio.load(body) 12 $('.unitBox_s strong > a').each((i, elem) => { 13 const url = $(elem).attr('href') 14 urls[i] = url 15 console.log(url); 16 }) 17 console.log(urls) 18 } catch (e) { 19 console.error(e) 20 } 21 }) 22} 23someFunction()

投稿2019/06/23 06:22

yasutomi

総合スコア2937

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

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

0

とりあえずresolveかrejectを返すようにしてみてはどうでしょうか
awaitの例を参照

投稿2019/06/23 03:42

hentaiman

総合スコア6421

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

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

hentaiman

2019/06/23 04:11

cheerioを調べてみたけど、awaitとかasyncとかを書かなければデフォルトでsyncっぽい動きをしてくれる作りになってるように見えます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問