RxPHP
最近最学习Rxjs,rxjs也叫响应式编程,在React和Angluer2使用的比较广泛,还有一点就是不要把Rxjs当作Promise来使用,虽然promise已经很不错了,可是在80%场景下需要promise写更多的代码才能实现rxjs的功能。如果你只是为了解决和接口之间的回调的那就不用用rxjs这种概念,因为他会把你的工作复杂话。
简介
Rxjs的内容可以概括为一个核心三个重点,核心就是Observable和Operators,三个重点分别是:
- observer
- Subject
- schedulers
其中众多的operator一直是我门学习Rxjs路上的拦路虎,文章主体内容也将是围绕这部分内容讲解。
这些东西自己去油管看吧,rxjs也准备第七版了。反正rxjs的概念很多,不过很适合做复杂的异步流。
RxJS 与 Promise 的3大重要不同点
PHP 回调地狱
说到回调调用,这里不得不提出PHP,我们先上一张图片,看看这个万恶的语言,虽然现在已经有laravel的collect(),不过有时候有些业务脱了collect()你就无法实现了
还是回到了php原生的回调地狱。
PHP数组操作麻烦
PHP 具有array_map、array_filter、array_reduce等用于阵列操作。
有许多函数可以由数组操作
基本上使用回调功能
我们看看写法
$languages = ['PHP', 'PYTHON', 'RUBY', 'GOLANG'];
$lengths = array_map(
function ($lang) { return str_len($lang) },
$languages
);
$filterd = array_filter(
$lengths,
function ($length) { return $length > 3 }
);
$sum = array_reduce(
$filtered,
function ($x, $y) { return $x + $y }
);
把它一个接一个地放在变量里是件麻烦事。
$languages = ['PHP', 'PYTHON', 'RUBY', 'GOLANG'];
$sum = array_reduce(
array_filter(
array_map(
function ($lang) { return str_len($lang) },
$languages
),
function ($length) { return $length > 3 }
),
function ($x, $y) {
return $x + $y
}
);
很难嵌套和查看,并且很难修改代码,而且很麻烦。
然逛现在用到Rxjs的概念的话
我们需要写引用一个rxphp的库
composer require reactivex/rxphp
我们的编写代码就可以编程这样
use Rx\Observable;
use Rx\Scheduler;
use Rx\Scheduler\ImmediateScheduler;
// 设置计划程序
$immediateScheduler = new ImmediateScheduler();
Scheduler::setDefaultFactory(function () use ($immediateScheduler) {
return $immediateScheduler;
});
// 阵列处理
const languages = ['PHP', 'PYTHON', 'RUBY', 'GOLANG'];
Observable::fromArray(languages) // Observable
->map(function ($lang) { // Operator
return str_len($lang);
})
->filter(function ($length) { // Operator
return $length > 3;
})
->reduce(function ($x, $y) { // Operator
return $x + $y;
})
->subscribe( //Observer
function ($sum) {
print("$sum")
},
// 错误处理
function (\Exception $ex) {
print($ex->getMessage())
},
// 结束处理
function () {
print('exit()')
});
我处理问题的思路就边得更加清晰了。