-
-
Notifications
You must be signed in to change notification settings - Fork 21
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in 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: