веб-сервисы amazon — Обещание в AWS SDK для PHP не работает и никаких ошибок не возвращается

Я пытаюсь использовать обещание в клиенте SNS (AWS SDK для PHP), но это не работает.
Этот код (синхронно) работает правильно с функцией createTopic:

require 'aws/aws-autoloader.php';
use GuzzleHttp\Promise;
use Aws\Sns\SnsClient;

$client = new SnsClient([
'version' => 'latest',
'region'  => 'ap-northeast-1',
'credentials' => [
'key'    => 'xxx',
'secret' => 'xxx',
],
]);
$result = $client->createTopic(['Name' => "test"]);
echo $result->get('TopicArn');

Но когда я хочу использовать обещание (асинхронный способ) с помощью функции createTopicAsync :

$result = $client->createTopicAsync(['Name' => "test"]);
$result->then(
function ($value) {
echo "The promise was fulfilled with {$value}";
},
function ($reason) {
echo "The promise was rejected with {$reason}";
}
);

Это не работает, и ничего не произошло, нет ошибки возврата.
Кто-нибудь может знать, что может быть не так?

2

Решение

Попробуйте добавить следующую строку:

// Wait for the operation to complete
$result->wait();

Таким образом, весь блок должен выглядеть

$result = $client->createTopicAsync(['Name' => "test"]);
$result->then(
function ($value) {
echo "The promise was fulfilled with {$value}";
},
function ($reason) {
echo "The promise was rejected with {$reason}";
}
);
// Wait for the operation to complete
$result->wait();

UPD: Очевидно, имеет смысл использовать асинхронный вызов таким образом. Но чтобы ответить на ваш вопрос: чтобы получить какой-либо результат в вашем случае, вы должны синхронно заставить свое обещание выполнить, как описано выше.

UPD2: Здесь вы можете увидеть пример выполнения нескольких асинхронных операций. Обратите внимание, что вам все равно придется вызывать wait () независимо от того, сколько у вас есть обещаний

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]