0

我正在创建的过程需要将数据发送到肥皂服务。在我得到理想的回应之前,我无法继续我的下一步行动。

try {
    $return = $soapClient->__soapCall("BulkLoadContacts",array('parameter' => $params));

    foreach ($return as $r){
        $upload_id = $r;
    }

    $process_params = array(
        'ProcessID' => $upload_id,
    );
    $return = $soapClient->__soapCall("GetProcessStatus",array('parameter' => $process_params));
    var_dump($return);

}
catch(SoapFault $fault){
    $status = false;
}

在上面的代码中,我执行了该BulkLoadContacts方法。然后我ProcessID从响应中获取。获得该 ID 后,我会再次调用以获取我的进程的状态。最后一个转储者告诉我的响应GetProcessStatus。自卸车看起来像:

object(stdClass)#18 (1) {
  ["WSProcessStatus"]=>
  object(stdClass)#19 (6) {
    ["ProcessID"]=>
    int(3313881)
    ["ListID"]=>
    int(268207)
    ["ProcessName"]=>
    string(20) "listrak_tempfile.txt"
    ["ProcessStartTime"]=>
    string(23) "2012-05-16T14:22:50.643"
    ["ProcessCompleteTime"]=>
    string(22) "2012-05-16T14:22:50.84"
    ["Status"]=>
    string(19) "ProcessingCompleted"
  }
}

最后一项是Status。只有在方法返回“ProcessingCompleted”的值之前,我才想继续。关于如何做到这一点的任何建议?一个简单的do-while就足够了吗?

4

1 回答 1

0

do/while 应该可以解决问题。但我建议在每个循环中放置一个延迟,否则您将敲打 Soap 服务器。

此外,您可能希望指定最大尝试次数。你不想让你的程序陷入无限循环。

try {
    $return = $soapClient->__soapCall("BulkLoadContacts",array('parameter' => $params));

    foreach ($return as $r){
        $upload_id = $r;
    }

    $attempts_remaining = 10;
    do {
        sleep(1);
        $process_params = array(
            'ProcessID' => $upload_id,
        );
        $return = $soapClient->__soapCall("GetProcessStatus",array('parameter' => $process_params));

        $attempts_remaining--;
    } while (($return->WSProcessStatus->Status != 'ProcessingCompleted') && ($attempts_remaining > 0));

    if($return->WSProcessStatus->Status == 'ProcessingCompleted') {
        //success
    }
    else {
        //timeout
    }


}
catch(SoapFault $fault){
    $status = false;
}
于 2012-05-17T17:46:37.607 回答