我有一个api类来联系REST api进行邮件列表管理。它包括subscribe()
,unsubscribe()
,update()
等方法。
在我的客户端代码中,我有
这样的行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循环。
如果没有,简单的方法是最合适的,那很好。我只是想知道是否有更好的方法,我不知道。
答案 0 :(得分: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);
}
您只需构造一个anomymous函数并将自治函数传递给处理重试的代码。显然,这应该更复杂一些,允许返回值(可以非常简单地添加)或者可以观察到。
使其可观察的一种方法是传递回调:
public function retry($apiCall, $retries, $callback) {
$success = false;
while (!$success && $retries > 0 ) {
$success |= $apiCall();
$retries--;
}
$callback($success);
}
您只需传递执行通知的正确回调即可。您可以通过传递更多关于事件类型和失败类型,重试次数等的详细参数来进行扩展,具体取决于您的具体需求。