2015年1月14日 上午2:25
前情提要:在 godfat 講「rest-core 的承諾」的那段時間,私下討論跟比較過 js 這邊慣用的 promise 用起來長怎樣。雖然一段時間前也討論過,但那時對 promise 還不熟,也沒寫 LiveScript 。
最近的心得可以在這裡找到。
特別喜歡這段:
#!/usr/bin/env lsc
require! {
rsvp: { Promise, all, hash }:RSVP
'prelude-ls': { apply, is-type }
}
wrap = ->
switch
| it |> is-type 'Array' => all it
| it |> is-type 'Object' => hash it
| otherwise => Promise.resolve it
p = -> Promise.resolve it
promisy = (f) -> (...args) -> wrap args .then (args) -> wrap f `apply` args
log = promisy console.log
add = promisy (+)
log p(41), 43
log add 41, p(43)
# more usages for you
class People
(@name_, @friend_) ~>
name:~
-> new Promise (resolve, reject) ~>
(~> resolve @name_) `setTimeout` 300
(v) -> @name_ = v
friend:~
-> new Promise (resolve, reject) ~>
(~> resolve @friend_) `setTimeout` 300
(v) -> @friend_ = v
var opal
ruby = People \ruby
opal = People \opal, ruby
ruby.friend = opal
start-time = Date.now!
ps =
* Promise.resolve ruby
.then (.friend)
.then (.friend)
.then (.name)
* ruby.name
apply log, ps
all ps .then -> console.log Date.now! - start-time
下面附上信的一部分,與提到的參考資料 XD
godfat:
我認為 ES6 的 generator 進來後,這 promise 其實就不太需要了 當然跟現有程式溝通是另一回事就是了
promise 的部分今天都當面講完了(灑花)。
以前我讀到的是這篇「Call/CC与Node.js」: https://blog.kghost.info/2011/10/31/callcc-and-node-js/
node.js 在 0.1.30 前自己就有 promise : http://japhr.blogspot.tw/2010/04/no-more-promises-in-nodejs.html
嗯,然後 generator, continuation, CPS 變換什麼的, 大概就是下一波讓 js programmer 自我感覺良好的關鍵 XD
像現在的 closure 那樣。
噢噢噢,可以開在 chrome 嗎? :D
看來是可以的? https://code.google.com/p/v8/issues/detail?id=2355
我用的關鍵字是: "enable es6 v8 chrome"
嘎,這是 MRI 沒錯,看來是 2.1 才改的 >< 奇怪,我太早把他當 public 了... 無奈 pull request 裡我是直接寫在 commit message 上,不便改.. XD
XDDDD
這封信沒多少以前的訊息,我會公開貼出來, 希望朋友都看得到,也方便一起討論。