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

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

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

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

コールバック

コールバックは他のコードに引数として渡されるコードのことを指します。

JavaScript

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

Q&A

解決済

2回答

734閲覧

Promiseの実行順序

blackcloud

総合スコア1

Node.js

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

コールバック

コールバックは他のコードに引数として渡されるコードのことを指します。

JavaScript

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

0グッド

0クリップ

投稿2021/08/25 02:53

前提・実現したいこと

JavaScriptのPromise.finally関数の仕様について知りたいのです。

もともとのソースコード(以下、"変更前コード")は、『ハンズオンNode.js』という書籍のサンプルコードです。
変更前コードに対し、
「アロー関数式の記載時は、"{}"でくくるように統一したほうが良い」
と考えたので
まず、Promise.finally関数の引数として関数を指定するときに、"{}"でくくるようにしました。
(以下、"変更後コード")

発生している問題・エラーメッセージ

####問題点:
変更前コードと変更後コードでコンソールへの出力内容は同じだと考えていたのですが、
以下のように変わってしまっています。
finallyメソッドの仕様(アロー関数式の仕様?)としてこのような違いが出てくるのであれば、
その部分についてご教示いただきたく思います。

#####コンソールへの出力内容:

######変更前コード

Promise { <pending> }

finally()で1秒経過

foo

※">"が引用だと解釈されてしまっています。

処理順は以下の通り?
1)finally関数が呼び出しているコールバック関数の戻り値が解決する
2)finally関数が戻り値(Promise)を返す

######変更後コード

Promise { <pending> }

foo

finally()で1秒経過

※">"が引用だと解釈されてしまっています。

処理順は以下の通り?
1)finally関数が戻り値(Promise)を返す
2)finally関数が呼び出しているコールバック関数の戻り値が解決する

該当のソースコード

JavaScript

1/*変更前コード*/ 2.editor 3Promise 4 .resolve('foo') 5 .finally(() => 6 new Promise(resolve => 7 setTimeout( 8 () => { 9 console.log('finally()で1秒経過') 10 resolve() 11 }, 12 1000 13 ) 14 ) 15) 16 .then(console.log) 17 18/*変更後コード*/ 19.editor 20Promise 21 .resolve('foo') 22 .finally( 23 () => { // ここに{を追加 24 new Promise(resolve => 25 setTimeout( 26 () => { 27 console.log('finally()で1秒経過') 28 resolve() 29 }, 30 1000 31 ) 32 ) 33 } // ここに}を追加 34 ) 35 .then(console.log)

試したこと

以下の2サイトを確認したのですが、私は実行順序の違いそのものの記載を見つけることができませんでした。
・finally関数の仕様
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise/finally

・アロー関数式の仕様
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Functions/Arrow_functions

補足情報(FW/ツールのバージョンなど)

・実行環境
OS:Windows 10 Pro 20H2
node.js:v14.17.5(REPL上で実行しています。)

・書籍のサンプルコード置き場
https://github.com/oreilly-japan/hands-on-nodejs/tree/master/ch02

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

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

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

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

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

guest

回答2

0

ベストアンサー

コールバックの記述に「{}」をいれたのであれば、returnされなくなります

javascript

1new Promise(resolve => 2↓↓↓ 3return new Promise(resolve => 4

投稿2021/08/25 03:00

yambejp

総合スコア114769

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

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

blackcloud

2021/08/25 04:02

ご回答ありがとうございます。 ご指摘いただいいた通り修正したところ、変更前コードとコンソールの出力が一致しました。 またアロー関数式の仕様を見直したところ、 "同様に、本文に処理の追加の行が必要な場合は、中括弧に加えて "return" を入れなおす必要があります (アロー関数は "return" する場所や返値を魔法のように推測できるわけではありません)。" という一文がありました。 これは"中括弧を使う⇒デフォルトでは何も返さない"ということだったのですね。 今回の例では、関数が1行なので、returnも不要なのかと考えておりました。 とても勉強になりました。重ね重ねありがとうございます。
yambejp

2021/08/25 04:07

参考までに const a=1; console.log((()=>a)()); // 1 console.log((()=>{a})()); // undefined console.log((()=>({a}))()); // {a:1}
guest

0

.finallyのコールバック関数がPromise返す場合、.finally自体の返り値となるPromiseはコールバック関数が返したPromiseも待つようになります。

  • () => new Promise()の場合、コールバックはPromiseを返す
  • () => { new Promise() }の場合、Promiseはつくられるけど返り値にはならない

という違いがあります。

投稿2021/08/25 02:58

maisumakun

総合スコア145183

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

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

blackcloud

2021/08/25 04:04

ご回答ありがとうございます。 問題が解決いたしました。 アロー関数式の仕様を見直したところ、 "同様に、本文に処理の追加の行が必要な場合は、中括弧に加えて "return" を入れなおす必要があります (アロー関数は "return" する場所や返値を魔法のように推測できるわけではありません)。" という一文がありました。 これは"中括弧を使う⇒デフォルトでは何も返さない"ということだったのですね。 今回の例では、関数が1行なので、returnも不要なのかと考えておりました。 ご回答の内容が、とても勉強になりました。 言語仕様の細かいところについて、より勉強を進めるよう精進いたします。 重ね重ねではありますがありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問