AWS SDK Promises обратный вызов для каждого обещания - PullRequest
0 голосов
/ 07 мая 2020

У меня есть обещание отправить электронное письмо, которое работает нормально.

$promise = $this->SesClient->sendEmailAsync($messages[0]);

$promise->then(
    function ($value) {
        echo "The promise was fulfilled with {$value}";
    },
    function ($reason) {
        echo "The promise was rejected with {$reason}";
    }
);

Однако я хочу иметь возможность объединить все свои электронные письма и отправлять их все параллельно, при этом сохраняя обратный вызов. В зависимости от того, было ли электронное письмо отправлено успешно или не удалось, я регистрирую его в своей базе данных.

У меня есть что-то вроде этого, которое отправляет все мои электронные письма нормально, но как мне использовать -> затем для каждого обещания затем выполнить действие для каждого из них после его завершения?

$promises = [];

foreach($messages as $message) {
    $promises[] = $this->SesClient->sendEmailAsync($message['Email']);
}

$results = Promise\unwrap($promises);

1 Ответ

0 голосов
/ 05 июня 2020

GuzzleHttp\Promise предоставляет конечному пользователю удобный интерфейс. Результатом вызова GuzzleHttp\Promise\PromiseInterface::then является экземпляр GuzzleHttp\Promise\PromiseInterface. Это позволяет конечным пользователям объединять в цепочку несколько then() блоков.

Для выполнения нескольких задач на основе одного ответа все, что нужно сделать, это «связать» блоки then

foreach($messages as $message) {
    $promises[] = $this->SesClient->sendEmailAsync($message['Email'])
                    ->then(function (SomeDataType $inputData) {
                        echo 'process some value in here';
                        return $processedValue
                    })
                    ->then(function (ProcessedDataType $value) {
                        echo 'store the processed value in the database';
                    });
}

Можно даже передавать значения от одного обещания к другому.

Более подробную информацию о Guzzle Promises можно найти здесь

...