2012-07-08 54 views
14

最近在處理Backbone.JS/jQuery/CoffeeScript項目時,我發現自己處於一個回調和計時問題。在繼續之前,我需要等待一些事情的完成,並發現自己陷入了一堆嵌套的回調......這很混亂,很難調試。然後我發現2個可能的解決方案jQuery deferredIcedCoffeeScriptIcedCoffeeScript或jQuery被推遲

IcedCoffeeScript看起來非常簡單,只需添加await & defer。但是,我想知道它是否留下來?這裏只有2個問題在StackOverflow上?與CoffeeScript相比,沒有太多的討論它

另一件事是兩種方法之間的區別是什麼,他們似乎做的大多是同一件事情?除了在IcedCoffeeScript,它看起來更像程序代碼,並在jQuery的延遲,它並沒有解決我的回調混亂之多

+0

jQuery的deferreds是一個美麗的事物。就個人而言,部分原因是我沒有使用CS,所以我願意這樣做。 – Utkanos 2012-07-08 13:24:15

回答

18

這些都是非常不同的技術:

  • IcedCoffeeScript是預編譯器它使用awaitdefer關鍵字對CoffeeScript進行了擴展,這些關鍵字將爲您轉換代碼,以便您可以以同步樣式編寫代碼。在生成的JavaScript中,awaitdefer產生嵌套函數。

  • jQuery的遞延(又名承諾)是完全側步回調的方式:而不是採取一個回調,異步函數可以返回的承諾。然後,您將回調附加到Promise。這是一個簡單但功能強大的技術。我在我的書中專門寫了一章,Async JavaScript

這些技術中的每一種對於某種類型的API都效果最好。 awaitdefer期望函數將單個回調作爲其最後一個參數。當您的應用中有許多其他Promise時,Promise的效果最佳。

在處理JavaScript中的異步行爲時,沒有什麼靈丹妙藥。您需要了解回調,Promise和PubSub(又名EventEmitter),併爲每項工作選擇最佳工具。即使你使用IcedCoffeeScript(這很酷),Promises仍然會爲你節省大量的工作。

我希望有幫助。看看我的書,Async JavaScript,瞭解更多信息。

+0

「當您的應用程序中有許多其他Promise時,Promises工作得最好」是一個有趣的聲明。你能把更多的肉放在上面嗎? – 2015-02-25 17:47:16

4

我寫了一篇博客有關標準事件回調,酒吧子和deferreds之間的差異,這可能會幫助你:

Event Emitter, Pub Sub or Deferred Promises … which should you choose?

的介紹寫着:

顯而易見的答案對於「您是否應該選擇事件 發射器,發佈器子版或延期/承諾」這一問題是否取決於您在做什麼 。

在這篇文章中,我將探討一下關於每種模式如何與 (非常)基本的實現協同工作,然後我會看看爲什麼你可能會選擇一種。

和總結是:

事件發射器是一個真正的經典之作,並允許良好做法,在事情發生 控制; Pub Sub對於 交叉組件事件更靈活;遞延,並承諾給予強大的方式來 處理回調。

將總結應用到您的問題 - 我會建議,延期和承諾可能會幫助你很多。

我不知道你怎麼想,但我發現讓我的頭周圍我將如何實現遞延真的幫助我瞭解使用它的複雜性。我在帖子中也包含了一些示例代碼,這些代碼非常簡單,可能會幫助您查看別人更強大的嘗試。

17

我覺得IcedCoffeeScript在這裏停留。

我打算無限期地支持它,我在修補它針對的主線很正規。我在幾乎所有的個人項目中都使用它,並且網站Combosaurus.com,OkCupid Labs項目即將推出一般發佈,寫在IcedCoffeeScript。

2

哦,我肯定會依靠IcedCoffeeScript。如果你喜歡並且使用CoffeeScript語法,你會發現它簡單地與它「自然地混合」...

關於項目的未來,我在前面有同樣的困境,但看起來像Maxwell Krohn是積極的維護它,並且圍繞它有一個不斷增長的社區和意識(好吧,也許這裏還沒有在stackoverflow上)。

去年我開始使用它,現在我無法真正想象如果沒有awaitdefer編碼「真實」應用程序。

你可以在ICS here上的優雅的異步控制流程中找到一個簡短的「protip」,我還寫了一個提到ICS的5部分ironically-titled article on using Node.js for generic web projects here