🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Node.js

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

JavaScript

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

Q&A

解決済

2回答

1629閲覧

jsでのasync/await(またはpromise)利用時の実行順序

allazward

総合スコア11

Node.js

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

JavaScript

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

0グッド

0クリップ

投稿2019/09/10 07:22

編集2019/09/10 07:50

現在下記のaction()を実行すると、
0
4
[object Promise]d
1
2
abc
3
と出力されます。
これを
0
1
2
3
4
abcd
と出力させたいのですが、
そうするには
console.log(message + 'c');の前に

js

1console.log(3); 2console.log(4);

と記述するしかないでしょうか

await action();と言う記述で
定義されたaction()内のすべての処理が終了するまで
待つという認識でした。
この認識は誤ってますでしょうか。
私の記述が悪いためこうなっているのか、
現在は
action()内のすべての処理が終了するまで
待たずにconsole.log("4");が実行されている状況です。
0
1
2
3
4
abcd
と言うように並ぶにはjavascriptの仕様として
どうするのが一番よろしいでしょうか。
どなたか教えてください。

js

1export default class TestClass { 2 async action(){ 3 await new Promise(function(resolve, reject){ 4 console.log(0); 5 resolve('a'); 6 }) 7 .then(function(message){ 8 console.log(1); 9 return message + 'b'; 10 }) 11 .then(function(message){ 12 console.log(2); 13 console.log(message + 'c'); 14 return message; 15 }); 16 console.log(3); 17 } 18} 19var result = await new TestClass().action(); 20console.log("4"); 21console.log(result + "d");

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

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

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

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

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

m.ts10806

2019/09/10 07:31

Node.jsはどのように関係しますか?
Lhankor_Mhy

2019/09/10 07:40

文法エラーが出ます。
allazward

2019/09/10 08:02

m.ts10806様、ありがとうございます。 ソースコードを修正致しました。 Node.jsを利用して見様見真似でビルド致しました。 そちらも関連があるかもと思い記載せて頂きました。 Lhankor_Mhy様、ご指摘ありがとうございます。 ソースコードを修正致しました。 環境等申し上げた方がよろしかったでしょうか。 node.jsはv10.16.0 またビルド時babel-loader(8.0.6)を利用しています
guest

回答2

0

awaitは、asyncな関数の中に書くものです。全体をasyncな即時関数に入れてしまうのがいいでしょう。

javascript

1(async () => { 2async function action(){ 3 await new Promise(function(resolve, reject){ 4 console.log(0); 5 resolve('a'); 6 }) 7 .then(function(message){ 8 console.log(1); 9 return message + 'b'; 10 }) 11 .then(function(message){ 12 console.log(2); 13 console.log(message + 'c'); 14 return message; 15 }); 16 console.log(3); 17} 18 19var result = await action(); 20console.log("4"); 21console.log(result + "d"); 22})();

(なお、actionに返り値がないので最後がundefineddとなってしまうなど、まだ適切でない箇所がいくつかあります)

投稿2019/09/10 07:32

maisumakun

総合スコア145975

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

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

maisumakun

2019/09/10 07:45

文法的に問題があったので、async 「function」 actionを補っています。
allazward

2019/09/10 07:56

ご回答ありがとうございます。 質問欄のコードを修正致しました。 その上でご回答頂いた内容を反映するため、呼び出し側を var result (async () => { var test = new TestClass(); result = await test.action(); })(); console.log(4); console.log(result + "d"); のように修正致しました。 が結果が変わりませんでした。
maisumakun

2019/09/10 08:04

asyncの外側のコードはasyncの実行を待ちません。console.log(4)などもasyncな無名関数の中に入れる必要があります。
allazward

2019/09/10 08:32

ご回答ありがとうございます。 1~4と言う順序はご指摘の通りの方法、 「asyncな無名関数の中に入れる」ことで対応できました。 「actionに返り値がない」について console.log(message + 'c');の下の行、 return message; で返せているという認識でした。 戻り値について呼び出し元に戻せるよう 修正してみたいと思います。また後程報告させて頂きたいと思います。
allazward

2019/09/11 00:17 編集

この度は色々とご教示下さりありがとうございました。 今後の参考にさせて頂きたいと思います。 action()の戻り値に関しては最後の.then()の中で 戻り値用の変数に設定し返却する方針を取りました。
guest

0

ベストアンサー

処理的にはこうじゃないですかね?

javascript

1const action=async()=>{ 2 var res=await new Promise(resolve=>{ 3 console.log(0); 4 return resolve("a"); 5 }).then(message=>{ 6 console.log(1); 7 return message + 'b'; 8 }).then(message=>{ 9 console.log(2); 10 return message+'c'; 11 }); 12 console.log(3); 13 return res; 14} 15 16(async()=>{ 17 var res=""; 18 await action().then(ret=>{res=ret}); 19 console.log("4"); 20 console.log(res + "d"); 21})(); 22

投稿2019/09/10 08:35

yambejp

総合スコア116690

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

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

allazward

2019/09/10 08:50

yambejp様、ありがとうございます。 var ret; await new Promise(function(resolve, reject){ ・・・ として最後の }).then(message=>{} の中で ret = message として 最後にretを返すという方針で記述していたところでしたが、 ご回答頂いたコード中、 var resに }).then(message=>{} 内の最後にreturnされたものが格納され、それを返す と言う認識でよろしいでしょうか、その方法がスマートなようなので そのようにしてみたいと思います。 ありがとうございました。 頂いたコードの中で、 await action().then(ret=>{res=ret}); について特に後半部分で何をしているかがわかりませんでした。 ret=>{res=ret}の部分ですが、 ここを日本語に翻訳して頂けないでしょうか。
yambejp

2019/09/10 08:55

actionはasyncを宣言した関数なのでpromiseを返します 戻ってくるのが”abc”という文字列なので var resで一時的につくっておいた変数にデータが投入され 後から参照できます
allazward

2019/09/10 09:15

ありがとうございます。 最後にもう一度確認させてください (async()=>{})(); の後に記述した処理は (async()=>{})();の処理の完了を待たずに進行し (async()=>{})();の完了を待って処理を行うには (async()=>{ 処理A })(); 上記の処理Aのように記述するしかない、という認識でよろしいでしょうか。
yambejp

2019/09/11 00:11

> (async()=>{})(); > の後に記述した処理は > (async()=>{})();の処理の完了を待たずに進行 そうですね (async()=>{ await console.log("1"); await console.log("2"); })(); console.log("3"); //出力1→3→2 になったりします
allazward

2019/09/11 00:13

この度はありがとうございます。今後の参考にさせて頂きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問