AJAX не перезаписывает глобальную переменную JQUERY

$.each(data, function (index, info) {
                    var a = info.notes;
                    var b = info.permission;
                    //var c = null;
                    var c = null;
                    $.ajax({
                        url: "assets/getExpiration.php?expiry=" + info.expiration,
                        type: "GET",
                        dataType: "text"
                    }, function(data){
                        c = data;
                    });
                    var z = null;
                    switch(info.stars) {
                        case 0: z = "<img src='assets/img/0star.png'/>"; break;
                        case 1: z = "<img src='assets/img/1star.png'/>"; break;
                        case 2: z = "<img src='assets/img/2star.png'/>"; break;
                        case 3: z = "<img src='assets/img/3star.png'/>"; break;
                        default: z = "<label class='label label-danger'>" + c + "</label>"; break; 
                    }

                    var notes = a.length > 0 ? "<i class='fa fa-file'></i>" : "";
                    var permission = b.length > 0 ? "<i class='fa fa-warning'></i>" : "";
                    if (info.status == 'EXPIRED') {
                        $("#pendingCall" + info.callNum).append("<button onclick="loadPlayer('" + info.playerTag+ "', '" + info.status + "', "+ info.callNum +")"class='btn btn-danger disabled'>" + info.username  + " " + permission + " " + notes + "</button>");
                    } else {
                        $("#pendingCall" + info.callNum).append("<button onclick="loadPlayer('" + info.playerTag+ "', '" + info.status + "', "+ info.callNum +")"class='btn btn-primary'>" + info.username + " " + permission + " " + notes + "<br> " + z + "</button>");

                    }
                });

c не редактируется. Однако, когда я console.log(c)внутри $.ajax()это дает мне правильное значение. Однако когда я console.log()за пределами $.ajax()он дает мне «null». Я искал много много много много stackoverflow похожие вопросы, но все ответы не работали или, возможно, я просто что-то пропустил.

2 ответа

  1. Вы предполагаете, что код из:

    var z = null;
    switch(info.stars) {....
    

    дождетесь завершения запроса ajax? Если да, то это не совсем так.

    Ajax запускает запрос асинхронно, в то время как остальной код продолжает выполняться (при условии, что вы не указываете, что он должен выполняться синхронно

    Если вы хотите работать со значениями, возвращенными AJAX, вам нужно добавить этот код в свойство успеха параметров ajax или аналогичный, который будет выполнен по завершении.

  2. $.ajax-это асинхронный метод, который мгновенно возвращается, но запускает функции success и error после завершения HTTP-запроса в фоновом режиме.

    Вам нужно будет переместить код в его собственную функцию, которая вызывается внутри $.ajax метод. Ниже приведен пример.

    $.ajax({
        url: "assets/getExpiration.php?expiry=" + info.expiration,
        type: "GET",
        dataType: "text"
    }, function (data) {
        c = data;
        var z = null;
        switch(info.stars) {
            case 0: z = "<img src='assets/img/0star.png'/>"; break;
            case 1: z = "<img src='assets/img/1star.png'/>"; break;
            case 2: z = "<img src='assets/img/2star.png'/>"; break;
            case 3: z = "<img src='assets/img/3star.png'/>"; break;
            default: z = "<label class='label label-danger'>" + c + "</label>"; break; 
        }
    
        var notes = a.length > 0 ? "<i class='fa fa-file'></i>" : "";
        var permission = b.length > 0 ? "<i class='fa fa-warning'></i>" : "";
        if (info.status == 'EXPIRED') {
            $("#pendingCall" + info.callNum).append("<button onclick=\"loadPlayer('" + info.playerTag+ "', '" + info.status + "', "+ info.callNum +")\"class='btn btn-danger disabled'>" + info.username  + " " + permission + " " + notes + "</button>");
        } else {
            $("#pendingCall" + info.callNum).append("<button onclick=\"loadPlayer('" + info.playerTag+ "', '" + info.status + "', "+ info.callNum +")\"class='btn btn-primary'>" + info.username + " " + permission + " " + notes + "<br> " + z + "</button>");
    
        }
    });