JSのasync/awaitを使ってフェードアニメーション完了後にログにOKと出す処理を書いたいのですが、
アニメーションが動いてる最中にOKと出力されてしまいます。
下記の修正すべき点をご指摘いただけませんでしょうか。
<script> jQuery( function($){ $(".home .s3 .box").css("position","absolute"); $(window).on("load scroll resize", function(){ asyncFunction(); }); function promiseIncrement() { return new Promise((resolve) => { $(".as").each(function(i){ var imgPos = $(this).offset().top; var scroll = $(window).scrollTop(); var windowHeight = $(window).height(); if (scroll > imgPos - windowHeight + windowHeight / 3){ // ここに処理を書く $(this).delay(200).css("visibility","visible").animate({opacity: 1}, 1000); } console.log(i); }); resolve(); //処理が完了したことを通知 }); } async function asyncFunction(x) { // await で Promise の解決を待つ const n = await promiseIncrement(); console.log('OK'); $(".home .s3 .box").css('position', 'relative'); } }); </script>
編集
下記のコードで期待する動作となりました。
$(".home .s3 .box").css("position","absolute"); $(window).on("load scroll resize", function(){ promiseIncrement(); }); function promiseIncrement() { var deferredArr = []; $(".as").each(function(i){ var imgPos = $(this).offset().top; var scroll = $(window).scrollTop(); var windowHeight = $(window).height(); if (scroll > imgPos - windowHeight + windowHeight / 3){ // ここに処理を書く deferredArr.push( $(this).delay(200*i).css("visibility","visible").animate({opacity: 1}, 1000)); } }); if( deferredArr.length > 0 ){ $.when.apply( $,deferredArr ).done(function(){ console.log('OK'); }); } } ```
HTMLも明示ください
「アニメーションが200msごとでなく一気に実行されるようになりました」とありますが、ぱっと見だと元のコードでも同様ではないですかね……?
(もしかして、実際のコードでは delay(200*i) と書かれているとか……?)
あぁ!
まさにその通りですTT
最初に記載したコードが既に間違っておりました・・・。
修正して再度試してみたいと思います。
修正したコードでいけたと思ったんですが、アニメーションの最中にスクロールすると次の処理がはしってdeferredArrが空になるためなのか、if( deferredArr.length > 0 ){でヒットしなくなってしまいました。
JS難しい・・・。
アニメーション開始のときに.asの要素にアニメーション開始済を示すクラスを付与してアニメーション開始済の場合は処理をはしらせないようにしようと思いますが、対策としてあっていますでしょうか。
それもいいとおもうのですが、resizeイベントはまともに受けてしまうと負荷が高いので、↓のようにsetTimeoutかませるのがいいかと思います。
https://w3g.jp/blog/intermittent_event_load_reduce
なお、「次の処理がはしってdeferredArrが空になる」というのは、コードを見る感じでは、なさそうかと思いますし、deferredArr が空の配列でもエラーは起きないんじゃないでしょうか?
とても参考になりました。
async/awaitについては理解を深めないとまだまだ使いこなせそうにありませんががんばりたいです。
ありがとうございました。
回答2件
あなたの回答
tips
プレビュー