October 8, 2013

Livescript Backcall

最近因緣際會之下開始碰 Livescript

原本好不容易把 Javascript 打通,以為可以開始用某種語言痛快說話時,突然又來了 Livescript,只好又開始牙牙學語

初碰 Livescript 總感覺到有無形的牆擋在前面,怎麼唸也不順,直到聽見高村長提到關鍵字「Perl」,心中好像有什麼結被打開了,與其把它當成某種 javascript 的變型,似乎把它當成 Perl 的變型要好一點,雖然原作者可能不這麼想 XD

心結打開就舒坦了一些

高村長又曾經開示 Livescript 重要的特色之一就是 backcall。如果沒有誤解,backcall 要解決的問題之一就是 javascript 可怕的 callback 地獄。以一段 pseudocode 來說

http.fetch_data(function(json) {
    open_file(function(filename) {
        save_to_file(filename, json);
    });
});

這段話可以如此解釋:從 http 取得一份資料,成功取得就打開檔案,然後把取得的資料存進檔案裡面。這些動作相當仰賴 callback,我們會一層又一層地將 function 物件傳進去,太多層就是 callback hell !!
用 Livescript 就可以透過 backcall 的方式這麼寫

json <- http.fetch_data
filename <- open_file
save_to_file filename, json

看起來比較簡潔,先來理解 backcall 的形式

callback_parameter <- caller_function
callback_body

箭頭的右側就是我們最先呼叫的 function,箭頭的左側則是傳入的 callback 參數,下方是 callback 的主體。也因此右側自成一組,左側與下方自成一組,看程式碼的時候就要這麼看它

json <- http.fetch_data
filename <- open_file
save_to_file filename, json


從形式上來看會是「執行 open_file 的 callback 是底下那一塊,左方是 callback 參數」。

既然要閱讀程式碼,就要能夠「唸」出來。我自己的念法就會是「http fetch data 之後就打開檔案,打開檔案之後就存入」,至於 parameters 的部份都忽略不看

update: 因為 callback chain 的關係,經常 callback 只會接受一個參數,也就是上一個 function call 的 return value。(不然就是再多一個 exception) 。在此前提下閱讀 backcall 就會簡單很多,上面的例子就是: http fetch data 的回傳值是 json,打開檔案回傳值是 filename,接著把 json 存進去 filename

這是我個人的理解方式,希望給同樣頭痛的人一點幫助

ps. 由於 backcall 底下都會是 callback body,若有不屬於 body 的 statements,用 do 就可以解決了

do
  json <- http.fetch_data
  filename <- open_file
  save_to_file filename, json
  this_is_in_callback \yeah

this_is_not_in_callback \yeah

No comments:

Post a Comment