跳到主要内容

\Co\defer

API

namespace Co;

function defer(Closure $closure): string;

参数说明

参数类型说明
$closureClosure延迟执行的闭包函数,在运行在事件上下文

闭包参数

返回值

返回当前事件唯一标识, 允许使用\Co\cancel方法取消事件

概述

Defer (延迟执行) , 在当前事件结束后立即执行一个闭包函数, 通常用于资源释放等操作。

基础用法

\Co\async(function () {
$file = fopen('file.txt', 'w');

\Co\defer(function () use ($file) {
//TODO: 此处的代码不会立即执行
fclose($file);
});

fwrite($file, 'hello world');
return 'async task';
});

defer在实际场景中很有用,例如在异步请求结束后,释放资源等操作。

public function index(Request $request) : JsonResponse
{
\Co\defer(function() use ($request){
$response = \Co\await(
\Co\Net::HTTP()->Guzzle()->getAsync('http://example.com');
);

$channel = \Co\IO::Channel()->open('websocket');
$channel->send($response->getBody()->getContent());

$channel->close();
});

return new JsonResponse(['status' => 'ok']);
}

提示

在ripple提供的脚手架中,绝大多数框架的控制器请求都会发生在async空间中, 你可以在控制器中使用\Co\defer方法