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

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

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

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

JavaScript

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

Q&A

解決済

2回答

4806閲覧

非同期処理の中で非同期処理

nasymt

総合スコア39

Node.js

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

JavaScript

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

0グッド

0クリップ

投稿2018/10/26 14:25

編集2018/10/26 14:54

node.jsでseleniumを使ってコードを書くことになったのですが(初心者ながら...)、
非同期処理の中で非同期処理が必要なケースが出てきました。
今までc++ばかりだったので非同期処理に慣れておらず、無茶苦茶な書き方になっていますが、アドバイスいただけると幸いです。

やりたいこととしては、hoge関数内の処理を、上から順番に処理をさせたいです。
実行すると、if文の処理が終わる前にreturnされてしまいます。

具体的に言うと、hoge関数では、webページのhtmlタグ(ボタン)を取得して、if文にある条件を満たすとボタンを押すようにしています。ボタンが押されるとページが遷移するので、ページが遷移したらhoge関数を抜けるということをやりたいです。

async function main() { driver = new webdriver.Builder() .withCapabilities(webdriver.Capabilities.chrome()) .build(); try { await driver.get('https://xxx'); await hoge(true,1); await hoge(true,2); } catch (e) { console.error(e); } }; async function hoge(toggle, sid) { await driver.wait(until.elementIsVisible(driver.findElement(By.xpath('//div[@jsname="ilpChd" and @data-sid=\"' + sid + '\"]'), 1000))); const elem = await driver.findElement(By.xpath('//div[@jsname="ilpChd" and @data-sid=\"' + sid + '\"]')); var isChecked = toBoolean("false"); await elem.getAttribute('aria-checked').then(function(val) { isChecked = toBoolean(val); }) if ((isChecked == false && toggle == true) || (isChecked == true && toggle == false)) { await elem.click(); async.whilst( function() { driver.findElement(By.xpath('//div[@data-id="EBS5u"]/content/span')).then(function(data) { console.log("find element"); return true; }).catch(function(err) { console.log("end loop"); return false; }) }, function(callback) { }, function(err, n) { } ); } return 0; }

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

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

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

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

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

guest

回答2

0

if文の処理が終わる前にreturnされてしまう。

ってことをやりたいんですか?
何が問題で、なにをどうしたいのかを書いてください


あるあるなんですが、その処理、本当に非同期の必要があるんでしょうか。
非同期処理上で、同期処理すれば済む話じゃないんでしょうか。

投稿2018/10/26 14:36

編集2018/10/26 14:42
y_waiwai

総合スコア87774

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

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

nasymt

2018/10/26 15:00

ご回答ありがとうございます。書き方が悪かったので、修正させていただきました。 すいません、どこまで非同期にすればいいかもわかっておらず、、 根本的にわかっていないので、改めて勉強し直します。
guest

0

ベストアンサー

async.whilst の中の ひとつめの function の driver......then...... を、 return driver......then...... と変更すれば行けそうに見えました。多分。
※追記: 無限ループの疑いがあります。コメント参照。

投稿2018/10/26 15:30

編集2018/10/27 10:26
set0gut1

総合スコア2413

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

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

nasymt

2018/10/26 16:21

ありがとうございます! 教えていただいた方法で無事うまくいくことができました。
set0gut1

2018/10/27 10:13

これもしかして無限ループしていませんか? Promise.resolve(false) は truthy で、 async.whilst は Promise を外すものだと勝手に思ってたのですが、どうも違う可能性があります。 ちょっとご確認お願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問