
//查询是否有 key $redis->get('key', function ($result, $redis)use($db){ //设置 key2 $redis->set('key2', 'value2', function ($result)use($db) { var_dump($result); //更新数据库 $row_count = $db->update('Persons')->cols(array('sex'))->where('ID=1') ->bindValue('sex', 'F')->query(); }); }) 如果这样我写的话,已经超过 3 层回调了,如果还需要再更新数据库里面发送一个异步 Http 请求(workerman/http-client),这样岂不是又多了一两层? 我该如何修改这个写法,才能像同步代码写法
1 imdong 2021-10-07 10:45:22 +08:00 via iPhone 最简单的但可能不是好的解决方案, $call_a = function … $redis->get(…, $call_a); 起码可以避免嵌套太多的问题,如果能用 class 更好,具体没用过 workeman |
2 airqj 2021-10-07 11:01:54 +08:00 via Android 作者好像说建议优先使用 redis 库 |
3 zjsxwc 2021-10-07 11:06:30 +08:00 |
4 zjsxwc 2021-10-07 11:40:48 +08:00 |
5 mywaiting 2021-10-07 12:53:24 +08:00 多年没有看 PHP,万万没有想到 PHP 现在也能写成 JS 了 Callback -> Promise -> Await/Async,所有编程语言都逃不过的异步坑 |
6 learningman 2021-10-07 23:10:39 +08:00 async/await |
7 div class="sep3"> cs5117155 OP @zjsxwc ```php $charecabinet_id =33; $getDeferred = new React\Promise\Deferred(); $initialPromise = $getPromise =$deferred= $getDeferred->promise(); $initialPromise->then(function() use($redis,$initialPromise){ $redis->set('key2', 'value32', function ($result)use($initialPromise) { $initialPromise->resolve($result); }); return $initialPromise; })->then(function($result)use($charecabinet_id,$initialPromise){ var_dump($charecabinet_id); $row_count = self::$db->update('xxx') ->cols(array('heart_time'=>time())) ->where("ID=$charecabinet_id")->query(); return $initialPromise->resolve($row_count); })->otherwise(function (\Throwable $x) { // Propagate the rejection echo 'Reject ' . $x->getMessage(); // 3 }); ``` 我参考你的写法,发现只运行到设置 key2=value32,第二个`then`没有运行下去了,是哪里姿势不对吗 |
8 zjsxwc 2021-10-08 15:49:50 +08:00 |
9 zjsxwc 2021-10-08 16:34:53 +08:00 |
10 cs5117155 OP @zjsxwc 按照你不同的 promise 还真可以了,我有个好奇,你是怎么搜到 `https://sergeyzhuk.me/2017/06/16/phpreact-promises/` 。我找谷歌搜到都是官网文档的 |