-
-
Notifications
You must be signed in to change notification settings - Fork 19
New issue
Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? # to your account
非同期関数でローカル変数が壊れる問題 #1758
Comments
上記サンプルの「には」構文を、関数定義の末尾に持っていくと問題なく実行できます。 理由ですが、ある関数Cで参照した関数Aから呼び出している関数Bが非同期(asyncFn)だったとき、その関数を呼び出す関数Cを非同期で実行する必要があります。 根本的な解決案としては、なでしこのユーザー関数をすべて非同期関数(asyncFn)であると仮定するしかありません。 そこで下記の2つの解決作があります。
|
ちょっと悩むけど、ユーザーにとって、変換され実行される時の関数がasyncかどうかはあまり問題ではないと思うので、上記(2)を採用するのが濃厚かも…。 |
ここに来て、以下のユーザー関数を全てaysncにする案が浮上中です。
|
非同期関数では、関数の呼び出し中に、別の関数の呼び出しが掛かるので、同期的に実行する関数ではあり得ない、ローカル関数の書き換え処理が行われることが原因です。 https://nadesi.com/cgi/kaizen3/index.php?m=log&logid=344 「秒待つ」の前後に変数の値を出力するコードを作って実行してみると、現象がよく分かります。
つまり、これを解決するには、非同期関数の呼び出すごとに、ローカル変数の値を待避し、呼び出し後に戻す処理が必要なことが必要です。 最初の例を整理したもの
|
全てのユーザー関数を非同期にするなら、タイマーやDOM系のイベントも全部非同期で呼び出す必要がある...うーむ |
まだ完全な修正には至っていません。引き続き問題を観察します。 |
https://nadesi.com/cgi/kaizen3/index.php?m=thread&threadid=92 より
v3.6.22でも似た感じのが発生しています
ローカル変数がundefinedになる
ちなみに関数Bで待った場合「B」は表示されます
https://nadesi.com/cgi/kaizen3/index.php?m=thread&threadid=94 より
実行結果
・v3.5.1(期待する動作)
1
2
・v3.6.1
2
2
・v3.6.25
2
undefined
The text was updated successfully, but these errors were encountered: