Przeszukałem inne pytanie / odpowiedź na to i wdrożyłem wszystko i nadal nie mogę uzyskać dostępu do wartości obiektu. Oto kod, którego używam:

function apply_voucher(voucher) {
    var dates = $.parseJSON($("[name='dates']").val());
    var voucher_yes_no = new Array();
    var voucher_reduction = new Array();

    if(voucher.length > 0)
    {
        $.each(dates, function(room_id, these_dates) {
            $.post('/multiroom/check_voucher/'+voucher+'/'+room_id, function(result) {
                if(result.result == 'ok') {
                    voucher_yes_no.push('yes');
                    voucher_reduction.push(result.voucher_reduction);
                } else {
                    voucher_yes_no.push('no');
                }
            }, 'json');
        });

        // check if there are any yes's in the array
        if('yes' in voucher_yes_no) {
            console.log("no yes's");
        } else {
            console.log(voucher_reduction);
            console.log(typeof voucher_reduction);
            for (var prop in voucher_reduction) {
                console.log(prop);
                console.log(voucher_reduction[prop]);
                if (voucher_reduction.hasOwnProperty(prop)) { 
                    console.log("prop: " + prop + " value: " + voucher_reduction[prop]);
                }
            }
        }
    }
}

Przepraszam za ciągłe logowanie {x0}} - Próbuję śledzić wszystko, aby upewnić się, że wszystko robi, co powinno. Wyjście konsoli, z którego się znajduję, jest poniżej:

screenshot

... który pokazuje obiekt zawierający jedną wartość, "1.01" i my console.log typeof typeof, aby upewnić się, że jest to właściwie obiekt (jak myślałem, że wściekłem się w pewnym momencie ). Po tym nie ma nic od wewnątrz pętli. Próbowałem jQuery's $.each() również bezskutecznie. Nie mogę zrozumieć, dlaczego nic nie próbuję, działa!

0
Helen Danger Burns 20 listopad 2013, 17:12

5 odpowiedzi

Najlepsza odpowiedź

Aby powiedzieć, że dla przyszłych widzów, którzy zmieniają sposób, w jaki zrobiłem to, aby użył właściwego odroczonego obiektów i obietnic, które uderzyły na chwilę, ale dostałem tam! Dzięki za wszelką pomoc, szczególnie @epascarello do wskazywania mnie we właściwym kierunku :) Gdy tylko zacząłem robić to w ten sposób tablice zaczęły się ponownie zachować jak tablicy, hooray!

Oto ostateczny kod:

function apply_voucher(voucher) {
    var booking_id = $("[name='booking_id']").val();
    var dates = $.parseJSON($("[name='dates']").val());

    if(voucher.length > 0) {
        var data = []; // the ids coming back from serviceA
        var deferredA = blah(data, voucher, dates); // has to add the ids to data
        deferredA.done(function() { // if blah successful...
            var voucher_yes_no = data[0];
            var voucher_reduction = data[1];

            if(voucher_yes_no.indexOf("yes") !== -1)
            {
                console.log("at least one yes!");
                // change value of voucher_reduction field
                var reduction_total = 0;
                for(var i = 0; i < voucher_reduction.length; i++) {
                    reduction_total += voucher_reduction[i];
                }
                console.log(reduction_total);
            }
            else
            {
                console.log("there are no yes's");
            }
        });
    }
}

function blah(data, voucher, dates) {
    var dfd = $.Deferred();
    var voucher_yes_no = new Array();
    var voucher_reduction = new Array();
    var cycles = 0;
    var dates_length = 0;
    for(var prop in dates) {
        ++dates_length;
    }
    $.each(dates, function(room_id, these_dates) {
        $.post('/multiroom/check_voucher/'+voucher+'/'+room_id, function(result) {
            if(result.result == 'ok') {
                voucher_reduction.push(result.voucher_reduction);
                voucher_yes_no.push('yes');
            } else {
                voucher_yes_no.push('no');
            }
            ++cycles;
            if(cycles == dates_length) {
                data.push(voucher_yes_no);
                data.push(voucher_reduction);
                dfd.resolve();
            }
        }, 'json');
    });
    return dfd.promise();
}
1
Helen Danger Burns 21 listopad 2013, 11:52

Myślę, że nie ma problemu z pętlą. Ale być może z obiektem.

Czy jesteś pewien, jakie właściwości nie sąsione? Spróbuj wykonać to, aby sprawdzić:

Object.getOwnPropertyDescriptor(voucher_reduction,'0');

Jeśli wróci niezdefiniowany, nieruchomość nie była istniała.

0
Techniv 20 listopad 2013, 16:15

Nie działa, ponieważ połączenie AJAX jest asynchroniczne!

Czytasz wartości, zanim zostanie zaludniony!

Przenieś kod i obserwuj, że magicznie zaczyna działać, ponieważ będzie działać po tym, jak faktycznie wypełniasz tablicę!

function apply_voucher(voucher) {
    var room_id = "169";
    var dates = $.parseJSON($("[name='dates']").val());
    var voucher_reduction = new Array();

    $.post('/multiroom/check_voucher/'+voucher+'/'+room_id, function(result) {
        if(result.result == 'ok') {
            voucher_reduction.push(result.voucher_reduction);
        }

        console.log(voucher_reduction);
        console.log(typeof voucher_reduction);
        for (var prop in voucher_reduction) {
                console.log(prop);
                console.log(voucher_reduction[prop]);
                if (voucher_reduction.hasOwnProperty(prop)) { 
                    console.log("prop: " + prop + " value: " + voucher_reduction[prop]);
                }
        }




    }, 'json');


}

Z tego, jak wygląda, planujesz sprawić, że wezwanie AJAX w pętli. Za to musisz poczekać, aż wszystkie wnioski do wykonania. Musisz użyć when() i then(). Odpowiedzi na innym pytaniu: https://stackoverflow.com/a/9865124/14104

1
Community 23 maj 2017, 12:05

Czy możesz pokazać, jak zdefiniowano voucher_redukty? Zastanawiam się, skąd pochodzi drugi wiersz wyjścia debugowania, którego począwszy od "0".

0
FrankZ 20 listopad 2013, 13:24

W tej linii:

console.log(vouncher_reduction[prop]);
               ^

Nazwa zmiennej jest nieprawidłowa (n) i prawdopodobnie przełamywa Twój kod.

0
Adminiculo 20 listopad 2013, 15:54