質問事項
JavaScript初学者です。
Promise.then().then()... を使えば非同期処理を逐次的にコントロールできることがわかりました。
また、Promise.then()は、Promiseがresolveやrejectされるまで実行されないことは理解しています。
ただ、その次のthen、はその前のthenの非同期処理結果を待ってくれないのでしょうか。
(その場合はthenの非同期処理の中でPromiseインスタンス生成して、別のthenチェーンを繋げるしかない?)
例えばのソースコード
JavaScript
1 new Promise(function (resolve) { 2 console.log("new promise start"); 3 setTimeout(function () { 4 console.log("new promise setTimeout"); 5 resolve(); <= このresolveされるまで次のThenは動かない(非同期を待つ) 6 }, 0); 7 console.log("new promise end"); 8 }) 9 .then(function () { <= setTimeoutでresolveされたらこのThenが動く 10 console.log("then1"); 11 return "then1 param"; 12 }) 13 .then(function (v) { <= 前のThenがresolve("then1 param")されたからこのThenが動く 14 console.log(v); 15 console.log("then2 start"); 16 setTimeout(function () { 17 console.log("then2 setTimeout"); 18 return new Promise(function (resolve) { 19 console.log("then2 new promise start"); 20 resolve("then2 new promise"); <= setTimeoutの中でresolveしたけど。。。 21 }); 22 }, 0); 23 console.log("then2 end"); 24 //then同期処理内でreturnされない場合はresolve()が返される 25 }) 26 .then(function (v) { 27 console.log(v); <= 前のThenのsetTimeoutを待たずresolve()で動いてしまう 28 console.log("then3"); 29 }); 30 31 console.log("end"); 32
new promise start
new promise end
end
new promise setTimeout
then1
then1 param
then2 start
then2 end
undefined <= 前のThenのsetTimeoutを待たないのでresolve()で動いてしまう
then3
then2 setTimeout <= 前のThenのsetTimeout結果は当然最後になる
then2 new promise start
こうするしかない?
質問事項にある通り、thenの非同期処理の中でPromiseインスタンス生成して、別のthenチェーンを繋げるしかないのでしょうか?
JavaScript
1 new Promise(function (resolve) { 2 console.log("new promise start"); 3 setTimeout(function () { 4 console.log("new promise setTimeout"); 5 resolve(); <= このresolveされるまで次のThenは動かない(非同期を待つ) 6 }, 0); 7 console.log("new promise end"); 8 }) 9 .then(function () { <= setTimeoutでresolveされたらこのThenが動く 10 console.log("then1"); 11 return "then1 param"; 12 }) 13 .then(function (v) { <= 前のThenがresolve("then1 param")されたからこのThenが動く 14 console.log(v); 15 console.log("then2 start"); 16 setTimeout(function () { 17 console.log("then2 setTimeout"); 18 return new Promise(function (resolve) { 19 console.log("then2 new promise start"); 20 resolve("then2 new promise"); <= setTimeoutの中でnew Promise 21 }).then(function (v) { 22 console.log(v); <= setTimeoutの中のPromiseのresolveを待ってくれる 23 console.log("then3"); 24 }); 25 }, 0); 26 console.log("then2 end"); 27 }) 28 29 30 console.log("end"); 31
new promise start
new promise end
end
new promise setTimeout
then1
then1 param
then2 start
then2 end
then2 setTimeout
then2 new promise start
then2 new promise
then3
回答ありがとうございました!!
根本的なthen()処理の理解が足りていない質問でした。。。
全員BAしたいくらいですが無理なので、コードまで書いてくださった@SAKASHITA-Kokiさんにさせていただきます。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/03/11 14:01