2013-01-17 57 views
3

我正在寫一個單頁的應用程序,並已經寫入了客戶端的數據訪問層。我的問題涉及到它的正確設計。雖然我明白JS是以回調爲中心的,但我不得不懷疑是否沒有更好的數據檢索方式。這是我目前的數據訪問的是如何與回調格式化的例子:JavaScript數據訪問設計

$interface.getDashboard = function (callback) { 
    callback({MyApplications:[]}); 
}; 

這裏是我想向移動,以消除回調所有的地方,需要:

$interface.getApplications = function() { 
    var v = amplify.store("api.applications"); 
    if (!v) { 
     v = []; 
     _get("/api/applications", null, function (results) { 
      amplify.store("api.applications", results, { expires: _cacheTimeOut }); 
      dataRefresh(); 
     }); 
    } 

    return v; 
}; 

在上面的代碼中,dataRefresh()會告訴所有適用的用戶刷新他們的數據。所以我想你可以說它仍然使用回調,但採用不同的方式。

有沒有更好的方法來做到這一點?我從來沒有爲JavaScript寫過一個強大的數據訪問層,並想知道是否有一種模式可能遵循約定或啓發式解決方案?

+0

有很多框架與jQuery一起工作來管理您的單頁應用程序設計,並允許您避免意大利麪代碼。骨幹是一個 –

+0

@BenjaminGruenbaum我聽說過骨幹,但我在這裏的嘗試是理解所需要的核心,而不是抽象自己,而只是一個黑匣子。 – doogle

+0

@doogle是的,但調用'dataRefresh();'它會記得所有用戶的'getApplications',如你所述。但我真的認爲這是過於複雜,應該使用回調或事件驅動的異步函數 – drinchev

回答

2

我目前正在處理如何設計和結構我正在一個新的企業級應用的JavaScript端相同的問題。

許多SPA實例/模板,如HotTowel是偉大的向你展示如何開始使用溫泉,但在大規模實施方面不給予太大的幫助。

Nicholas Zakas的talk提出了一個很好的解決方案。談話的幻燈片可以找到here

總之,客戶端側的層應包括:

  1. 一組模塊的 - 這些提供的功能上分離的單位爲您的應用。他們應該完全相互獨立,只知道沙箱。

  2. 沙箱 - 這提供了用於將模塊一起工作一致的門面接口,並且充當模塊和應用芯之間的控制器。

  3. 應用的核心 - 這是負責模塊管理,互通,並通過您的應用程序(例如Ajax請求)所需的任何其他核心功能的調解人。只有應用程序核心應該知道您正在使用的基礎庫。

  4. 基礎庫 - 這些瀏覽器提供歸一化和作爲DOM操作任何其它通用功能,例如。

link擴展了這個設計,並提供了一些更詳細。

我知道這個答案沒有具體解決您的數據訪問層,但作爲一個更一般的體系結構概述也許你可以申請的概念應用到您的特定情況。

編輯:

AuraJS是一個具體的實現由Zakas概括的理論,由阿迪·奧斯馬尼開發的。它目前在開發者預覽版中,但它看起來像是一個很好的想法起點。

+0

這正是我需要!謝謝! – doogle

+0

已更新回答,並鏈接到AuraJS。 –

+0

我最終沒有任何依賴地實施中介模式秒。這很容易實現,併爲我的應用程序提供了大量的重用和靈活性。 – doogle