2017-10-12 88 views
1

例如,我試圖創建一個類似於doesObjectExist()的方法,但對於名爲doObjectsExist()的多個文件。問題是如果所有文件都存在,我需要它返回true,如果只有一個文件不存在,則返回false。這是我目前的方法。如果即使一個CommandPool失敗,Amazon S3 PHP SDK也會返回false,否則返回true

public function doObjectsExist(...$objects) { 
    $client = $this->client; 
    $bucket = $this->bucket; 
    $commands = []; 
    foreach ($objects as $key) { 
     $commands[] = $client->getCommand('HeadObject', [ 
      'Bucket' => $bucket, 
      'Key' => $key 
     ]); 
    } 
    $pool = new CommandPool($client, $commands, [null, 
     'rejected' => function (AwsException $reason, $iterKey, PromiseInterface $aggregatePromise) { 
      return false; 
     } 
    ]); 
    $promise = $pool->promise(); 
    try { 
     $promise->wait(); 
     return true; 
    } 
    catch (AwsException $e) { 
     return false; 
    } 
} 

回答

0

由於您希望函數在任何缺少的文件上返回false,因此在$ commands後面添加一個變量$ missing = false。在你的「拒絕」回調函數中設置$ missing = true。在$ promise-> wait()之後,如果$ missing等於true,則返回false。

我會改善被拒絕的功能,以實際測試$理由你需要檢測。

[編輯]

下面是一個例子,可以幫助您通過與解釋示例代碼瞭解CommandPool。

Command Objects

+0

最初有一個變量來跟蹤丟失,但它並沒有等待設置。吮吸,幾乎沒有關於這個在線信息。 –

+0

我不明白你的意思是「但它沒有等待設置」。 –

+0

例如,你的變量名'$ missing'在一個被拒絕的CommandPools中有'$ missing = true'。如果我在try/catch塊的'$ promise-> wait()'之後立即執行'if($ missing)',諷刺的是不會等待'$ missing'被設置爲true。我希望我清除它。 –

相關問題