Есть ли способ преобразовать асинхронный массив в синхронизацию для использования в коде php? - PullRequest
0 голосов
/ 22 июня 2019

У меня есть этот код:

<script>
        var avatar = [];
        var names = [];
        var star = []
        var forks = [];

        async function pegaRepositorio(){
            const url = "https://api.github.com/search/repositories?q=language:Java&sort=stars&page=1"
            const response = await fetch(url)
            const resultado = await response.json()

            resultado.items.forEach(i=>{
            avatar.push(i.owner.avatar_url);
            names.push(i.name);
            star.push(i.stargazers_count);
            forks.push(i.forks_count);
        })
    }
    </script>

Я хочу использовать эти 4 массива в коде php, но когда я печатаю, то за пределами асинхронной функции они возвращают undefined (отображается Undefined, потому что браузер не ждетHTTP-ответ, так что print undefined, и когда я смотрю на консоль, у него уже есть ответ, но он уже напечатан (звучит странно, я знаю).Есть способ, который я могу использовать тогда в этом коде php / html?Я просто хочу использовать свои данные в этом для цикла:

Php / HTML код:

<div class="container-fluid bg-claro">
        <?php

        for($i=0;$i<30;$i++)
        {
            ?>

        <div class="container mt-15">
            <div class="row repo">
                <div class="col-3">
                    <img src="<?php echo "<script>document.writeln(avatar[$i]);</script>";?>" id="logo" class="circulo img-fluid" alt="">
                </div>
                <div class="col-7" style="padding-left: 0;">
                    <p class="titulorepo"><?php echo "<script>document.writeln(names[$i]);</script>";?></p>
                </div>
                <div class="col-2 colstars">
                    <div class="star">
                        <i class="fas fa-star"></i>
                        <p class="numbers"><?php echo "<script>document.writeln(star[$i]);</script>";?></p>
                    </div>
                    <div class="fork">
                        <i class="fas fa-code-branch" style="margin-left: 4px;"></i>
                        <p class="numbers"><?php echo "<script>document.writeln(forks[$i]);</script>";?></p>
                    </div>
                </div>
            </div>

        </div>
        <?php 
        }
        ?>
    </div>

1 Ответ

0 голосов
/ 22 июня 2019

Обратите внимание, что PHP - на стороне сервера, а JS (код, который вы написали) - на стороне клиента.

Это означает, что PHP сначала работает (после отправки запроса на сервер), затем отправляет данныеклиенту, где JS вступает во владение.

Нет способа изменить это.Если вы хотите, чтобы PHP что-то сделал, вы должны отправить запрос - и дождаться ответа сервера.Вы не можете управлять процессами PHP из внешнего интерфейса, только отправляя новый запрос и ожидая нового ответа.

Таким образом, функция цикла PHP (которую вы написали в текстовом редакторе) уже завершена, когда появляется HTMLв вашем браузере.Никакие данные, запрашиваемые из внешнего интерфейса, не могут изменить уже законченный цикл PHP.

Но есть как минимум два способа заставить ваш код работать:

  1. Вместо PHP,создайте JS-строку «template» и зациклите ее, поэтому создайте окончательную HTML-строку на стороне клиента.

  2. Используйте cURL (или любой другой инструмент) для запроса API на стороне сервера,создайте HTML с помощью PHP, а затем отправьте его клиенту.

...