質問: Promise.resolve(); promise .then(func1(arg)) .then((res) => { func2(res) }); } function func1(a) { return new Promise(function (resolve, reject) { // 引数 a を受け取って返り値 b を求める resolve(b); }); } function func2(c) { // 受け取った引数 c を使った関数 } ``` **やりたいこと(期待する動作)** 1. 引数 arg が渡された関数 hoge は、関数 func1 に引数 arg を渡す 2. 引数 arg が渡された関数 func1 は、返り値 res を引数として関数 func2 に渡す 3. 関数 func2 は、受け取った引数 res を使って処理をする です。ただし、1, 2を分けているのはこちらの都合で、関数 func1 を別の部分でも使いまわしたいためで、今回の質問とは関係はありません。 **この関数を実行するとどうなるか** func1 の返り値を待たずして、 func2 に引数 undefined が渡されてしまい、**期待する動作**ができません。 なお関数 func1 は、単独で動かした際、引数 a を受け取って返り値 b を返すことは確認済みです。 **質問したいこと** promiseの書き方が悪い、ということは分かっているのですが、どのように書き直したら動くのかがわかりません。 promiseの使い方を紹介している各種Webサイトでは、then以下には新たに関数が書かれているものしか見当たらなく、別に作ったpromiseを返す関数(ここでは func1 )を使ったものが見当たらなかったため、こちらに質問させていただいた次第です(探しもの下手なため、同様の疑問が解決されているページ等ありましたらお教えいただければ幸いです)。 なお、func1 と func2 は別々の関数として置いておきたいため、hoge 内に直書きすることは考えていません。 以上です。皆様のお力添えをいただけましたらありがたいです。 何卒よろしくお願いいたします。
回答: ソース === おそらくやりたいことは下記で実現可能かと思います。 ``` function hoge(arg) { const promise = Promise.resolve(); promise .then(func1(arg)) .then((res) => { func2(res) }); } function func1(a) { return function() { return new Promise(function (resolve, reject) { // 引数 a を受け取って返り値 b を求める resolve(a + "B"); }) } } function func2(c) { // 受け取った引数 c を使った関数 console.log(c) } hoge("A") ``` そもそもご質問なさったソースは `SyntaxError: missing ) after argument list` でエラーなので、適宜補っておきました。 出力結果 ==== `AB` 参考 == 参考になるかどうかわかりませんが、 私が以前Promiseを習得するために練習で作ったソースを書いた記事を載せておきます。 リンク:Promiseで順番に実行したいとき