caasih.net

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

這封信沒多少以前的訊息,我會公開貼出來, 希望朋友都看得到,也方便一起討論。

Isaac Huang 發佈於