等待

不論是哪種程式語言,「等待」都是相當重要的功能,透過等待的方式,可以讓一連串程式延遲進行,也可以搭配迴圈進行一連串同步的動作,在一些較為複雜的程式運算裡,更是時常見到「等待」的身影。

打開 Webduino Blockly 編輯器 ( https://blockly.webduino.io ),展開左側目錄「進階功能」,點選「等待」,可以看到對應的等待積木。

Webduino Blockly 等待積木

同步與非同步

等待的積木有分兩種,分別是同步與非同步的積木 ( 非同步的積木會標註非同步 ),但究竟什麼是同步?什麼又是非同步呢?所謂的「同步」,就是不同流程工作前進的步伐一致,為了要協調彼此的步伐,會有「等待其他工作完成」的情況發生,因此「等待」也就成為同步程式設計的一個重要特質,同步的程式也常出現在像 Arduino 使用 C 或 C++ 的情況。

「非同步」剛好和同步相反,各個程式流程間並不會互相等待,非同步的程式常見於各種網頁的語法,雖然隨著網頁技術的演進,網頁也逐漸能使用同步的程式,但在目前的過渡階段,仍然會有兩者混用的情況發生。

非同步等待

非同步等待積木可以指定等待的秒數,在秒數到達後就會執行對應的內容。

非同步等待積木

如果只有一個非同步等待的積木,出來的結果和同步等待是類似的,舉例來說,一開始先使用顯示文字的積木顯示 AAA,然後使用非同步等待積木,等待一秒後顯示 BBB,程式執行後,就會先顯示 AAA,經過一秒之後就顯示 BBB。

顯示使用一個非同步等待積木結果

但如果有兩個以上的非同步等待積木,將它們都設定為等待一秒,執行後會發現結果不會依序顯示,而是等待一秒之後同時執行,又因為「同時」的緣故,結果就會變成按照程式的排列順序來執行,也就會變成 AAA 顯示完之後,等待一秒出現的結果是 CCC。( 並非 BBB 沒有執行,而是執行的速度太快所以看不到 )

顯示使用兩個以上非同步等待積木結果

想要使用非同步等待的積木,要做到同步等待的效果,可將非同步等待一層層的擺放在執行的順序內,就可以一秒一秒等待下去進行。

將非同步積木達成與同步等待結果

回顧過去的變數流程邏輯的教學文章,透過變數、流程、邏輯的互相組合,就能夠做出一個每 0.2 秒自動加總,直到數字為 10 才停止的程式。

範例解答:https://goo.gl/kKsFqb

非同步積木與變數、流程、邏輯積木互相組合

非同步重複執行

非同步重複執行,表示指定一個間隔時間,內部的流程就會不斷間隔著執行下去。

非同步重複執行

舉例來說,可以用 a 與 b 兩個變數,讓 a 一開始等於 0,b 等於 1,透過非同步重複執行每隔 0.2 秒讓 a 加 b,當變數 a 大於等於 10 就讓變數 b 變成 -1,當變數 a 小於等於 0 就讓 b 變成 1,如此一來就會在 0 到 10 的數字區間不斷遞增與遞減。

範例解答:https://goo.gl/tJcyNn

將 0 到 10 的數字不斷遞增與遞減

等待

雖然目前瀏覽器尚未全面支援同步等待的功能,但在 Webduino Blockly 仍然透過背後的程式,讓這個等待的積木,是以同步的方式進行操作。

等待積木

以剛剛提到非同步等待的例子來說,使用同步等待的積木,就會比較直覺的先顯示 AAA,等待一秒後顯示 BBB,再等待一秒後顯示 CCC。

顯示同步等待結果同步等待積木搭配無窮迴圈

把同步等待積木搭配無窮迴圈,就能做出每多少秒自動累加數字並顯示的效果,設定迴圈的「直到」,讓迴圈在數字累加到 10 的時候停止。

範例解答:https://goo.gl/N9d3z1

同步等待積木搭配無窮迴圈

如果要做到非同步重複執行的動作,同樣只要使用無窮迴圈和同步等待,當變數 a 大於等於 10 的時候讓 b 等於 -1,在變數 a 小於等於 0 的時候讓變數 b 等於 1,就能夠在 0 到 10 的數字不斷遞增與遞減。

注意!使用無窮迴圈一定要搭配「同步等待」功能或停止無窮迴圈的判斷條件,否則迴圈停不下來,可能就會發生瀏覽器資源耗盡當掉的狀況。


範例解答:https://goo.gl/swwnwD

非同步重複執行