2016-11-30 66 views
2

我有一個api類來聯繫郵件列表管理的REST api。它包括方法,如subscribe()unsubscribe()update()將重試功能添加到api調用的好方法?

在我的客戶端代碼,我行如

Api::subscribe($email, array(..)); 

因爲偶爾的失敗,我們要重試功能添加到每個呼叫。如果第一次通話失敗,我們希望在我們最終放棄之前重試一次或兩次。

直進的方式來做到這一點是

public static function subscribe($email, array $lists) { 
    $success = FALSE; 
    $retries = 3; 
    while (! success && retries > 0) { 
    // API call goes here 
    $retries--; 
    } 
} 

沖洗和重複每種方法。

爲了DRY(不要重複自己)的利益,我想知道是否有一個很好的,設計模式的方式來重寫我的調用,而不必重複每個方法的while循環。

如果不是,簡單的方法是最合適的,那很好。我只想看看有沒有更好的出路,我不知道。

+1

有不同的方法來處理這個問題,但在我們的例子中,我們是在HTTP客戶端級別上完成的。非常簡單,因爲它是最瞭解協議的層。 – Evert

回答

3
public function retry($apiCall, $retries) { 
    $success = false; 
    while (!$success && $retries > 0) { 
     $success |= $apiCall(); 
     $retries--; 
    } 
} 

public static function subscribe($email, array $lists) { 
    retry(function() { 
    // your API call here 
    }, 3); 
} 

您只需構造一個匿名函數並將自治函數傳遞給處理重試的代碼。顯然,這應該是更復雜一點,以允許返回值(可以添加非常平凡)或可觀察。

的一種方式,使其可觀察到的是通過傳遞一個回調:

public function retry($apiCall, $retries, $callback) { 
    $success = false; 
    while (!$success && $retries > 0) { 
     $success |= $apiCall(); 
     $retries--; 
    } 
    $callback($success); 
} 

你會只需要通過適當的回調,做通知。根據您的具體需求,您可以通過傳遞關於事件種類,失敗類型,重試次數等更詳細的參數來大幅度擴展。

+0

非常感謝!你能鏈接到使這個可觀察的任何提示? – user151841

+0

您可以使其可觀察,就像您可以使其他任何可觀察的動作一樣:通過允許回調或偵聽器進行註冊和通知。 – Polygnome

+0

感謝您添加回調代碼。這有點出於我的肯定。 – user151841