首页 > 解决方案 > AWS SDK Promises 回调每个承诺

问题描述

我承诺会发送一封可以正常工作的电子邮件。

$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}";
    }
);

但是,我希望能够合并我所有的电子邮件并同时发送它们,同时仍然有回调。根据电子邮件发送成功或失败,我将其记录在我的数据库中。

我有这样的东西,它可以很好地发送我的所有电子邮件,但是我如何在每个承诺上使用 ->then 在完成后为每个承诺执行一个操作?

$promises = [];

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

$results = Promise\unwrap($promises);

标签: phpamazon-web-servicespromiseaws-sdkguzzle

解决方案


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';
                    });
}

甚至可以将值从一个 Promise 传递到下一个 Promise。

更多关于 Guzzle Promise 的信息可以在这里找到


推荐阅读