我有一个 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 循环。
如果没有,简单的方法是最合适的,那很好。我只是想看看是否有我不知道的更好的出路。
最佳答案
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);
}
您只需传递执行通知的适当回调。您可以根据您的具体需要,通过传递有关事件类型和故障类型、重试次数等的更详细的参数来极大地扩展这一点。
关于php - 向 api 调用添加重试功能的好方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40897618/