Я пытаюсь использовать обещание в клиенте 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}";
}
);
Это не работает, и ничего не произошло, нет ошибки возврата.
Кто-нибудь может знать, что может быть не так?
Попробуйте добавить следующую строку:
// 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 () независимо от того, сколько у вас есть обещаний
Других решений пока нет …