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の記事で解説します!