2016-04-05 3 views
1

Ich versuche, Versprechen in SNS-Client (AWS SDK für PHP), aber es funktioniert nicht. Dieser Code (synchrone Art und Weise) arbeiten direkt mit der Funktion createTopic:Versprechen in AWS SDK für PHP funktioniert nicht und keine Fehlermeldung

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

Aber wenn ich Versprechen (asynchron) unter Verwendung Funktion verwenden möchten 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}"; 
    } 
); 

es nicht funktionieren und nichts ist passiert, keine Fehlerrückkehr. Wer könnte wissen, was falsch ist?

Antwort

1

Versuchen Sie, die folgende Zeile hinzufügen:

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

So ist der komplette Block wie

$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 aussehen sollte: Offensichtlich macht es ein wenig Sinn auf diese Weise async nennen zu verwenden. Aber um Ihre Frage zu beantworten: Um ein Ergebnis in Ihrem Fall zu erhalten, sollten Sie Ihr Versprechen synchron abschließen, wie oben beschrieben.

UPD2: Hier können Sie sehen an example of executing multiple async operations. Beachten Sie, dass Sie warten müssen() auf jeden Fall, egal wie viele Versprechen Sie haben

+0

Vielen Dank. Aber die wait() - Funktion wird verwendet, um synchron ein Versprechen zu vervollständigen. Das ist nicht das, was ich will. Hat jemand irgendwelche Ideen? – hiepns

+0

Dann sollten Sie beschreiben, was genau Sie erreichen möchten. Wenn Sie mehrere asynchrone Aufrufe durchführen, müssen Sie für jede Operation eine separate Zusage erstellen und dann warten, bis die Reihe der Versprechen abgeschlossen ist. Sie müssen also wait() trotzdem anrufen. – xtx

+0

Ein Beispiel für die Ausführung mehrerer asynchroner Operationen hinzugefügt. – xtx

Verwandte Themen