2012-02-28 42 views
0

我有一種方法可以同時從PHP調用兩個服務。由於Flex的多任務功能,我認爲每個服務都在不同的線程中調用。Flex上多任務的問題

我的問題是:兩個服務都從數據庫返回一個對象數組。但是第二個服務將爲每個記錄提供一個處理程序的DataGrid。這個處理器會比較兩個數組中的數據,當Flex完成第一個數據之前,我有一個問題,因爲處理器試圖將數據與一個空對象進行比較(PHP服務沒有響應)。

任何想法?

編輯:

在我張貼了這個問題的日子,有些人給了我一個驚人的想法,但遺憾的是好像他刪除了他的職位,我不知道爲什麼。我保留了他的想法,並且發現了一個符合我的設計模式和他的想法的解決方案。

他告訴我把一個標誌告訴我,如果數據已經加載或沒有。 所以這裏是我現在正在做的事情: 我打電話給第一個服務; 我打電話給第二個服務;

關於第一個服務的結果,我檢查第二個服務上的標誌,如果它是真的,表示它已經加載,所以我可以將我的數據存儲在DataGrid中,以便可以調用處理程序。 如果該標誌爲false,則表示第二個數據尚未加載,因此不是將數據存儲在官方dataProvider中,而是將其存儲在未綁定到dataGrid的_temp DataProvider中。在這種情況下,當加載第二個數據時,偵聽器事件被分派給第一個服務,告訴他捕獲_temp dataProvider並將其複製到官方dataProvider。

特別是,我喜歡這個解決方案,它不會破壞Table Data Gateway設計模式。

謝謝大家的幫助。

回答

5

由於Flex的多任務處理能力,我認爲每個服務都是在不同的線程中調用的 。

是什麼讓你覺得Flex支持多線程? It really doesn't. Single Thread only.

但是,您的調用是異步的,因爲當它們發送時,程序不會停下來等待答案,而是偵聽完成事件。

您的解決方案很簡單:只發送第一個請求,等待它完成,然後在完成處理程序中發送第二個請求。

編輯

爲了保護您的設計模式,你可以申請兩種不同的策略:

  1. 使用Business Delegate pattern:有一個自定義類充當網關和封裝的實際連接您的服務。然後它可以派發自己的COMPLETE事件來觸發你擁有的處理程序。對於DataGrid來說,它看起來像是一個單獨的異步調用。

  2. 使用Session Facade pattern:在服務器端創建單個服務,它接受單個請求,在本地調用引用的服務,並在單個響應中返回兩個服務的組合數據。

1

Flex沒有多線程,但它可以一次有多個異步調用。您可以通過讓每個返回處理程序檢查以確保兩個服務在返回到依賴於兩者的代碼之前返回,從而不知道哪個返回會首先返回。

0

讓我們假設你有兩個服務.. FirstService SecondService

private function init(): void 
{ 
    // Call the first service. 
    myService.FirstService(); 
} 

private function firstServiceResult(re:ResultEvent) :void 
{ 
    // Perform what you need to do with the results of your FirstService (i.e. set the result to array). 
    // Afterwards, call the next service. 
    myService.SecondService(); 
} 

private function secondServiceResult(re:ResultEvent) :void 
{ 
    // Perform what you need to do with the results of your SecondService. 
    // Now you can compare the result in the first service and the second service. 
} 
+0

這正是我告訴_weltraumpirat_,在他的回答,我不能這樣做,由於設計patterh表數據網關。但是,謝謝你的幫助。 – 2012-02-29 16:34:53