【Bubble】Workflowの実行順序の仕様
概要
Workflow構築していると、想定通りに動かない場面に遭遇するかもしれません。これは私たちの実装方法の問題の可能性もありますが、Bubbleの仕様である可能性が考えられます。
本記事では、Workflowの仕様について解説します。
ℹ️ 本記事はこちらのForum記事を参照しています。内容をさらに詳しく学びたい方は記事の方も併せてご覧ください。
同期処理と非同期処理
仕様の解説の前に、同期処理と非同期処理についての理解が必要です。これらは処理の実行順序の違いを表します。
同期処理は、1つずつ順番に実行し、処理が完了したら次の処理に移ります。
処理が完了する順番は、必ず1→2→3の順となります。
Workflowが想定通りに動かせない方は、同期処理の考えを想定しているかもしれません。
しかしBubbleのWorkflowは基本的に、非同期処理に該当します。
非同期処理は、処理の完了を待たずに次の処理を実行します。
図の例だと、処理の開始は1→2→3ですが、処理の完了は2→3→1となります。
非同期処理は、処理の同時進行による効率化がメリットですが、処理順序の制御が難しくなることがデメリットです。
Bubbleではこの非同期処理が基本であることを前提とし、引き続き仕様の解説に移ります。
Workflowの実行順序の仕様
通常のWorkflowは、順に実行されるが、前のStepの処理完了は待たない
Workflowタブから実装できる通常のWorkflowでは、Step1の処理の次にStep2が実行されますが、Step1の処理が終わっていなくてもStep2の処理を開始します。
Step1, Step2という名前はあくまで順番を表すものであり、前のステップの完了を待ってから次のステップを開始するわけではありません。
例えば以下のようなWorkflowがあります。(処理の内容は適当です)
実行の流れをグラフにすると、次のようになります。
例えばもしStep1でDo a Search forを実行した場合、データ取得に時間がかかり、処理時間が長くなります。その結果をStep2で使おうとした場合、正しい結果を得られない可能性があります。
Backend Workflowは、Stepを無視し、Workflowの開始と同時に実行する
ℹ️ Backend Workflowの解説については、こちらの記事をご覧ください。
BubbleのWorkflowは効率化のために、サーバーサイドとフロントエンドで並行に実行されます。
先ほどの通常のWorkflowは、フロントエンドでの処理です。
Backend Workflowはサーバーサイドでの処理なので、Workflowが開始するとすぐに実行されます。
たとえば「Schedule API Workflow」というBackend Workflowを呼び出すActionは、下図のようにStep4に配置していても、Workflowの開始と同時(Step1と同時)に実行されます。
グラフで表すと以下の通りです。
Custom Eventは、処理の完了を待ち、順に実行される
Workflow内では、Custom Eventを作成できます。
下図のように、あらかじめCustom EventとしてWorkflowを定義します。
それを「Trigger a custom event」で呼び出し、実行できるのです。
このとき、Custom Eventは並列でなく順番に実行されます。
上記の例の場合、Step3でCustom Event Aを呼び出しました。この中の2つの処理(Create a new ItemとDelete Item)の完了を待ってから、Step4が実行されます。
ただし、Custom Event内の処理については通常と同様、前のStepの完了を待たずに実行されます。
グラフで表すと、以下通りです。
想定通りの実行順序を実現するための方法
仕様を理解した上で、想定通りの実行順序を実現するための方法を紹介します。
Custom Eventを組み合わせることで実行順序を制御する
Custom Eventの前後では実行順序が保証されるという仕様を利用します。
例えばBackend Workflowを呼び出す「Schedule API Workflow」が最初に実行されないようにするには、Custom Event内へ入れることで制御できます。
Result of new thingを使うことで、順に実行される
前のStepの結果を使用する「Result of new thing」というActionがあります。
これを使用すると、前のStepの完了を待ってからデータを取得し、次の処理を実行できます。
Add a pause before next actionで、Workflowを一時停止させる
Navigation内の「Add a pause before next action」を使うと、Workflowを指定した秒数だけ一時停止させられます。
これを利用し、前Stepの処理時間を確保してから、次の処理へ移ります。
単位はミリ秒なので、画像の場合だと1秒間の一時停止です。
Only whenによる条件分岐は、ActionでなくEventで分岐させる
Workflowを条件付きで実行するために、Only whenという項目があります。
これはActionでもEventでも設定できます。画像はEventで設定しています。
Event内のActionそれぞれに条件をつけられますが、前のActionの完了を待たないため、条件が想定通りに動作しない可能性があります。
その場合は、画像のようにEvent単位で条件を付けることで順序を制御しやすくなります。