我有两个尖锐的要求,其中一个需要先完成。我只是使用
sleep(7)
为了确保第一个请求在第二个继续前进之前完全完成,请在两个耗时请求之间使用。问题在于速度,有时第一个请求可以在一秒钟内完成,或者两次或两次以上,有时可能需要六秒钟。
当前代码:
$client = new Client([
'base_uri' => 'https://ids.w2p-tools.com/',
]);
$response = $client->request('POST', 'd003/requestpreview.php', [
'form_params' => [
'auth' => $auth,
id' => $id,
'res' => $res,
'shownonprintlayer' => $show_non_print_layers
]
]);
sleep(7);
我尝试通过执行以下操作将其转换为异步请求:
$client = new Client([
'base_uri' => 'https://ids.w2p-tools.com/',
]);
$request = new Request('POST', 'd003/requestpreview.php', [
'form_params' => [
'auth' => $auth,
'id' => $id,
'res' => $res,
'shownonprintlayer' => $show_non_print_layers
]
]);
$test = 'None Hit';
$promise = $client->sendAsync($request);
$promise->then(
function (ResponseInterface $res){
$test = 'ResponseInterface Hit';
},
function (RequestException $e) {
$test = 'RequestException Hit';
}
);
$response = $promise->wait();
return $test;
这总是返回“未命中”。
做错了什么?
答案 0 :(得分:0)
$test
不是全局的。
将test = none移到顶部,然后将函数签名更改为使用var,因为它不是我们添加的对象,而是通过引用引用它,这意味着它也会全局更改。
$test = 'None Hit'; // move up here to make it the default
$promise->then(
function (ResponseInterface $res) use (&$test) { // use $test by reference
$test = 'ResponseInterface Hit';
},
function (RequestException $e) use (&$test) {
$test = 'RequestException Hit';
}
);
$response = $promise->wait();
return $test; // should now have text from one of the closures