clue/promise-stream-react

此包已废弃,不再维护。作者建议使用 react/promise-stream 包。

React PHP 中 Promise-land 和 Stream-land 之间缺失的连接

v0.1.2 2016-05-25 19:01 UTC

This package is not auto-updated.

Last update: 2022-02-01 12:57:22 UTC


README

此包现已迁移到 react/promise-stream,仅保留以支持向后兼容。

$ composer require react/promise-stream

如果您之前使用过此包,升级不应超过几分钟。所有功能都已从最新的 v0.1.2 版本合并,没有其他更改,因此您可以简单地更新您的代码以使用更新的命名空间,如下所示

// old from clue/promise-stream-react
\Clue\React\Promise\Stream\buffer(…);

// new
\React\Promise\Stream\buffer(…);

有关更多详细信息,请参阅 react/promise-stream

以下文档适用于此包的最后一个版本。进一步的开发将在更新的 react/promise-stream 中进行,因此强烈建议您尽快升级。

遗留的 clue/promise-stream-react 构建状态

基于 React PHP 的 Promise-land 和 Stream-land 之间的缺失连接。

目录

注意:此项目处于测试阶段!欢迎报告您遇到的问题。

用法

这个轻量级库只包含几个简单的函数。所有函数都位于 Clue\React\Promise\Stream 命名空间下。

以下示例假设您使用类似以下的导入语句

use Clue\React\Promise\Stream;

Stream\buffer(…);

或者,您也可以使用它们的完全限定名称来引用它们

\Clue\React\Promise\Stream\buffer(…);

buffer()

可以使用 buffer(ReadableStreamInterface $stream) 函数创建一个解析为流数据缓冲区的 Promise

$stream = accessSomeJsonStream();

Stream\buffer($stream)->then(function ($contents) {
    var_dump(json_decode($contents));
});

一旦流关闭,promise 将解析为所有数据块的连接。

如果流已关闭,promise 将解析为空字符串。

如果流发出错误,promise 将拒绝。

如果它被取消,promise 将拒绝。

first()

可以使用 first(ReadableStreamInterface|WritableStreamInterface $stream, $event = 'data') 函数创建一个在给定事件首次触发时解析的 Promise

$stream = accessSomeJsonStream();

Stream\first($stream)->then(function ($chunk) {
    echo 'The first chunk arrived: ' . $chunk;
});

promise 将解析为首次发出的事件或 null(如果事件未传递任何数据)。如果您不传递自定义事件名称,则它将等待第一个 "data" 事件,并解析为包含第一个数据块的字符串。

一旦流关闭,promise 将拒绝——除非您正在等待 "close" 事件,在这种情况下它将解析。

如果流已关闭,promise 将拒绝。

如果它被取消,promise 将拒绝。

all()

函数 all(ReadableStreamInterface|WritableStreamInterface $stream, $event = 'data') 可以用来创建一个 Promise,该 Promise 将解析为所有事件数据的数组。

$stream = accessSomeJsonStream();

Stream\all($stream)->then(function ($chunks) {
    echo 'The stream consists of ' . count($chunks) . ' chunk(s)';
});

Promise 将解析为一个包含所有已发出事件的数组,如果事件没有传递任何数据,则为 null。如果您不传递自定义事件名,则它将等待所有“data”事件,并解析为包含所有数据块的数组。

一旦流关闭,该 Promise 将解析为数组。

如果流已经关闭,该 Promise 将解析为空数组。

如果流发出错误,promise 将拒绝。

如果它被取消,promise 将拒绝。

unwrapReadable()

函数 unwrapReadable(PromiseInterface $promise) 可以用来解包一个解析为 ReadableStreamInterfacePromise

此函数立即返回一个可读流实例(实现 ReadableStreamInterface),作为未来 Promise 解析的代理。一旦给定的 Promise 解析为 ReadableStreamInterface,其数据将被管道传输到输出流。

//$promise = someFunctionWhichResolvesWithAStream();
$promise = startDownloadStream($uri);

$stream = Stream\unwrapReadable($promise);

$stream->on('data', function ($data) {
   echo $data;
});

$stream->on('end', function () {
   echo 'DONE';
});

如果给定的 Promise 被拒绝或解析为除了 ReadableStreamInterface 实例之外的任何内容,则输出流将发出 error 事件并关闭。

$promise = startDownloadStream($invalidUri);

$stream = Stream\unwrapReadable($promise);

$stream->on('error', function (Exception $error) {
    echo 'Error: ' . $error->getMessage();
});

给定的 $promise 应该是挂起的,即它不应该在调用此函数时被解析或拒绝。如果给定的 Promise 已经确定并且没有解析为 ReadableStreamInterface 实例,那么您将无法接收 error 事件。

unwrapWritable()

函数 unwrapWritable(PromiseInterface $promise) 可以用来解包一个解析为 WritableStreamInterfacePromise

此函数立即返回一个可写流实例(实现 WritableStreamInterface),作为未来 Promise 解析的代理。一旦给定的 Promise 解析为 WritableStreamInterface,您写入代理的任何数据将被管道传输到内部流。

//$promise = someFunctionWhichResolvesWithAStream();
$promise = startUploadStream($uri);

$stream = Stream\unwrapWritable($promise);

$stream->write('hello');
$stream->end('world');

$stream->on('close', function () {
   echo 'DONE';
});

如果给定的 Promise 被拒绝或解析为除了 WritableStreamInterface 实例之外的任何内容,则输出流将发出 error 事件并关闭。

$promise = startUploadStream($invalidUri);

$stream = Stream\unwrapWritable($promise);

$stream->on('error', function (Exception $error) {
    echo 'Error: ' . $error->getMessage();
});

给定的 $promise 应该是挂起的,即它不应该在调用此函数时被解析或拒绝。如果给定的 Promise 已经确定并且没有解析为 WritableStreamInterface 实例,那么您将无法接收 error 事件。

安装

安装此库的推荐方法是通过 Composer新用户 Composer?

这将安装最新支持的版本。

$ composer require clue/promise-stream-react:^0.1.2

有关版本升级的详细信息,请参阅变更日志

许可证

MIT