日本語プログラミング言語なでしこの公式掲示板

なでしこ3 質問

トップ 新規 検索

2024-01-03 12:58:24

たぶん、こう…!

TKI さん

生成されるJavascriptを見た感じでは特定の条件におけるバグを踏んだように思います。
・asyncFn===trueでマークされる、非同期な命令を使用している
・pure!==falseでマークされる、変数への参照・設定を含む可能性のある命令を使用している
・その命令を呼び出しているスコープにローカル変数が存在する
AWAIT実行は前2つの条件を満たしてます。
この3つの条件が揃うと、この命令の行が非同期の待機なしで実行されます(バグだと思われる)。
(「それ」への代入も非同期になってます)
そのため、「その」への代入が遅れて、1つまえの「その」が見えているのだと思います。
「その」を介さずAWAIT実行の行でspに代入した場合、awaitで待つべきPromiseが代入されます。
どちらの場合も期待したようになりません。
なお、spにPromiseを入れたケースでそのPromiseをユーザ関数から戻り値とした場合は、ユーザ関数の呼び出しにawaitが付くので呼び出し元では内容が取り出せます。

王道としてはバグが修正されるのを待つことになると思います。

解読に時間がかかりました(ことばがむずかしかった)

> なお、spにPromiseを入れたケースでそのPromiseをユーザ関数から戻り値とした場合は、ユーザ関数の呼び出しにawaitが付くので呼び出し元では内容が取り出せます。

つまり、こう…!

//----------------------
file = 「spines/spineboy.json」
sp=SPINEテスト(file)//③ユーザ関数の呼び出しにawaitが付くので
spをコンソール表示//④呼び出し元では内容が取り出せます。
sp["spineData"]["animations"][0]["name"]を言う //⑤→death

●SPINEテスト(ファイル名)
 AAA=『
(async function (ファイル名) {
    return new Promise((resolve, reject) => {
        const app = new PIXI.Application({width: 800,height: 600});
        document.body.appendChild(app.view);//キャンバスを置く
        const loader = PIXI.loader
        loader.add('spd', ファイル名);
        loader.load( (loader,res) => {
            var sp = new PIXI.spine.Spine(res.spd.spineData);//リソースをspineに変換
            sp.y = 600;
            sp.x = 400;
            sp.state.setAnimation(0, sp.spineData.animations[6].name, true);
            app.stage.addChild(sp);//キャンバスに追加
            console.log(sp);//spineのデータが表示される
            resolve(sp);//なでしこ3の変数に戻したい
        })
    })
})
』をJS実行
 sp=AAAを[ファイル名]でAWAIT実行//①spにPromiseを入れたケースで
 spを戻す//②そのPromiseをユーザ関数から戻り値とした場合は
 



(編集パスワード送信)

子記事

親記事 (No.1799)
返信した記事(元) (No.1805)

この内容(No.1812)に返信

この内容(No.1812)をダウンロード

この内容(No.1812)のテキスト表示





www.eznavi.net