Как загрузить представление CodeIgniter в $ обещание-> тогда () в контроллере? - PullRequest
0 голосов
/ 15 декабря 2018

В моем контроллере CodeIgniter 2 я вызываю метод модели, который возвращает обещание ReactPHP, и я хочу загрузить представление CodeIgniter в функцию, вызываемую методом ->then() этого обещания.Как я могу это сделать?Вместо этого метод контроллера ничего не возвращает, поэтому я получаю пустую страницу в браузере.

Вот упрощенный пример, иллюстрирующий то, что я пытаюсь сделать:

class My_class extends My_Controller {

    function my_method() {

        $this->my_model->returns_a_promise()->then(function ($data) {

            // How can I pass the promise's resolved value to the template here?
            // It seems this never gets called, because my_method() returns 
            // before we get here. :(
            $this->load->view('my_view', $data);

        });

    }

}

Есть ли способ сказать контроллеру, что метод не должен отправлять вывод в браузер до тех пор, пока обещание не будет выполнено?

Ответы [ 3 ]

0 голосов
/ 16 декабря 2018

Оказывается, код в моем оригинальном вопросе работает.Таким образом, вопрос является ответом.Но причина, по которой это не сработало для меня, заключалась в том, что returns_a_promise() не возвращал обещание решено , поэтому ->then() не было вызвано и представление не было отображено.Чтобы вернуть возвращенное обещание, мне нужно было вызвать $deferred->resolve(); в коде, который возвращал обещание.

В результате этот пример кода демонстрирует возможность запуска асинхронного PHP (черезReactPHP в данном случае) в методах контроллера CodeIgniter.Мой конкретный пример использования - одновременный запуск множества запросов к базе данных в модели CodeIgniter.

0 голосов
/ 17 декабря 2018

попробуйте это:

 function  my_method() {
        $data = array();
       $data['promise'] =$this->my_model->returns_a_promise();
         $data['view'] = 'my_view';
        $this->load->view('my_view', $data);
    }
0 голосов
/ 15 декабря 2018

Я не уверен, что вы пытаетесь сделать, но если вы хотите остановить вывод представления и вернуть его в виде строки, а затем вывести его самостоятельно с помощью echo, вы можете сделать это:

$view = this->load->view('my_view', $data, TRUE);

Теперьу вас есть представление как строка var, которую вы можете использовать для выполнения того, что вы пытаетесь сделать.

...