rontolisp:then
(rontolisp:then value fn)
value (通常はプロミス) とコールバックから新しいプロミスを導出します。
JavaScript の Promise.prototype.then がモデルです: 導出されたプロミスを
await すると、value を await した結果に fn (1 引数の関数) を適用します。
then は常にプロミスを返すのでチェーンでき、コールバックがプロミスを返した
場合は JavaScript と同様に平坦化されます。プロミスでない value も渡せて、
その場合は値がそのままコールバックに渡ります。
典型的な使い方は rontolisp:fetch のレスポンスの変換です。
(print (rontolisp:await
(rontolisp:then (rontolisp:fetch "https://httpbin.org/get")
(lambda (r) (getf r :status))))) ; 200
実行タイミング
コールバックは遅延実行されます: 導出されたプロミスが最初に await されたときに走り、結果はメモ化されるため、何度 await してもコールバックは高々 1 回しか実行されません。この「await 時に実行」 というタイミングは 3 バックエンドすべてで同一です (WASM バックエンドには確定 時にコールバックを走らせるイベントループがありません)。一度も await されない チェーンのコールバックは実行されません。
エラー
失敗したベースのプロミス (例えば接続拒否) はコールバックをスキップします:
インタプリタと JVM では await から失敗がシグナルされ、WASM では失敗した
fetch が nil に解決されてコールバックに渡ります
(rontolisp:await のエラーの節を参照)。エラー用
コールバック (onRejected) 引数はありません。
バックエンドのサポート
rontolisp:await や
rontolisp:promisep と同様に、すべてのバックエンド・
すべての WASM モード (Preview 1 を含む) で動作します。