Skip to content
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

非同期命令呼び出しが待ち合わせされず非同期になる #142

Open
weyk opened this issue Dec 30, 2023 · 3 comments
Open

Comments

@weyk
Copy link
Contributor

weyk commented Dec 30, 2023

ユーザ関数から「AWAIT実行」を用いた場合が該当するのですが、関数呼び出しのコード生成の際に、
・非同期のユーザ関数や命令で呼び出し部分にawaitが付与される
・無名関数で包んでの呼び出しの形になる(無名関数にasyncが付与される)
が揃うと、無名関数の呼び出し部分にはawaitが付かないため、非同期で処理される上、結果を受け取れない状態になっているようです。
その際、「それ」への更新も非同期化された側に入るので時間差で代入されるようです。

@kujirahand
Copy link
Owner

kujirahand commented Dec 30, 2023

無名関数にも、ダミーのSYNCを入れると、awaitが付与されると思うのですが、たぶん、私がweykさんの意図を読み切れない感じがします。すみません。

下記のサンプルだと動いている感じなのですが、もう少し具体的に、どんな場合が該当するのか、例を出していただけるでしょうか。

# 無名関数をAWAIT実行
A=関数(A)
  ASYNC
  1秒待つ
  「A:{A}」と表示。
  Aを戻す
ここまで。
Aを[3]でAWAIT実行
# 無名関数の中で無名関数をAWAIT実行する
A=関数(A)
  ASYNC
  B=関数(B)
    ASYNC
    1秒待つ
    BR=B*2
    「B:{BR}」と表示。
    BRを戻す
  ここまで。
  「A:{A}」と表示。
  BR=Bを[3]でAWAIT実行
  1秒待つ
  BRを戻す
ここまで。
Aを[3]でAWAIT実行してARに代入。
「C={AR}」を表示。

@weyk
Copy link
Contributor Author

weyk commented Dec 31, 2023

説明できないので下記のプログラムでの、コンソール表示される部分が
「BBB」になるはずが、Promiseのobjectになっているという話です。
テストの呼び出し時に付くawaitのおかげで呼び出し元ではBBBが結果として
表示されますが、テストの関数内では非同期のままでAWAIT実行が無意味です。
`●テスト(XXX)
 AAA=『
(async function(CR) {
return CR;//なでしこ3の変数に戻したい
}
)』をJS実行
 spはAAAを[XXX]でAWAIT実行
 spをコンソール表示
 spで戻る
ここまで

VVはテスト("BBB")
VVを表示`

@kujirahand
Copy link
Owner

kujirahand commented Jan 1, 2024

なるほどです!良いサンプルありがとうございます。
asyncFnがtrueになっているとき、pureがfalseだと、awaitがうまく動かないようです。
そこで、asyncFnであれば、pureをtrueを強制するように修正します。

そう思うと、pureは、かなり副作用が大きいです😭
nako_gen.mtsでpure=falseの場合に、awaitを付けるようにすれば良いのですが、これは、複雑なので、修正が難しいです。

# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants