前提・実現したいこと
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
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/08/25 04:02
2021/08/25 04:07