2013-07-23 44 views
0

我正在學習coffeescript,並將其與node.js結合使用,在express.js上構建基本的rest api。Coffeescript + Node.js:回調的替代品

我開始意識到我的代碼覆蓋了多層的回調。一些谷歌搜索告訴我,有一些替代品,如承諾,期貨和發電機。

  1. 我不熟悉這些條款。你能用通俗的話來解釋這些嗎?
  2. 這些都可以在Coffeescript中使用嗎?如果是這樣,我將不勝感激一些資源來學習它。
  3. 你有偏好嗎?
+1

1.谷歌適用於這種類型的更好的相當完整的答案題。是的,所有的JavaScript結構都可以用於咖啡腳本。這裏有幾個陣營,但節點純粹主義者堅持普通的舊回調。 –

回答

0

看async.js(https://github.com/caolan/async) 它不引入新的概念,但可以簡化回調湯成更易於管理性和可讀性。例如,而不是

foo(data, (err, result) -> 
    bar(result, (err, omgimtired) -> 
     foobar(omgimtired, (err....) -> 
      ... 
     ) 
    ) 
) 

你可以只用async.waterfall和飼料它的功能清單,呼籲此起彼伏。

承諾是相當簡單的(如果你設法圍繞他們思考)。他們描述了一個特定操作結果的對象。想象一下,你從所有代表結果的函數中返回對象。現在想象一下,每個結果都有一個函數(then(...)),它傳遞了一個「成功」完成回調和一個不成功回調回調。很簡單,對吧?唯一讓承諾特別的是這個回調可能會返回另一個承諾,這應該首先被滿足,以實現「封閉」承諾。等等。您只需用.then(...)調用的鏈來替換一系列回調。

Parse.User.logIn("user", "pass", { 
    success: function(user) { 
    query.find({ 
     success: function(results) { 
     results[0].save({ key: value }, { 
      success: function(result) { 
      // the object was saved. 
      } 
     }); 
     } 
    }); 
    } 
}); 

Parse.User.logIn("user", "pass").then(function(user) { 
    return query.find(); 
}).then(function(results) { 
    return results[0].save({ key: value }); 
}).then(function(result) { 
    // the object was saved. 
}); 

http://blog.parse.com/2013/01/29/whats-so-great-about-javascript-promises/

喝這庫爾急救http://www.slideshare.net/domenicdenicola/callbacks-promises-and-coroutines-oh-my-the-evolution-of-asynchronicity-in-javascript 從類似的話題What are the differences between Deferred, Promise and Future in JavaScript?