LoginSignup
0
0

UWSCRの新機能:非同期処理

Last updated at Posted at 2023-12-13

Taskという仕組みが追加され、async/awaitができるようになりました。命名に関してはC#でTaskと呼んでるのでそれでいいかな、という感じでやりました。

組み込み関数による非同期処理

Task()関数でユーザー定義関数を非同期に実行し、Taskオブジェクトを返します。非同期実行された関数の結果を得るにはWaitTask()を実行します。

function func()
    print "タスク処理開始"
    sleep(1)
    print "タスク処理中"
    sleep(1)
    result = "タスク処理終了"
fend

t = task(func) // task関数に非同期実行する関数を渡す
print "func関数が非同期実行されています"
print waittask(t) // waittask関数にタスクオブジェクトを渡すと終了を待って結果を返す
出力
タスク処理開始
func関数が非同期実行されています
タスク処理中
タスク処理終了

async/await

asyncキーワードを付けることで非同期関数を定義できます。

async function func()
    print "タスク処理開始"
    sleep(1)
    print "タスク処理中"
    sleep(1)
    result = "タスク処理終了"
fend

awaitキーワードで非同期関数の終了を待ちます。

print await func()

非同期関数はTaskオブジェクトを返すため、WaitTask()関数も利用可能です。

t = func()
print waittask(t)

Taskオブジェクトを返す関数であればawaitできるためTask()関数もawaitできます。

function func()
    print "タスク処理開始"
    sleep(1)
    print "タスク処理中"
    sleep(1)
    result = "タスク処理終了"
fend

print await task(func)

世界一雑なasync/await実装

一応非同期に動くよね、という程度の実装で非同期処理の実装として正しいのかどうか?もよくわからずやっています。使い道も想定されておらずちゃんと使えるかどうかも実はわかりません!なにか不都合や改善点などありましたらgithubでご一報ください。

Promise対応

UWSCRのブラウザ操作機能でJavaScriptオブジェクトを得られるのですが、それがPromiseだった場合にWaitTask()関数で終了を待って結果を得られるようになっています。また、JavaScriptの非同期関数をawaitできます。

// ブラウザ起動または再接続
chrome = BrowserControl(BC_CHROME)
tab = chrome[0]
tab.navigate("https://example.com")

// 非同期関数を作る
func = tab.eval("async (n) => n * 2;")

// 非同期関数を実行してPromiseを得る
promise = func(5)
// WaitTask()で終了を待って値を得る
print waittask(promise) // 10

// awaitもできる
print await func(10) // 20

ブラウザ操作はUWSCR新機能の中でも目玉となるすごいやつです。詳しくは12/24の記事で解説します!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0