Массив Javascript пуст при использовании в JSON.stringify - PullRequest
0 голосов
/ 06 ноября 2019

Мой проект использует Dev Extreme и его компонент данных. Эта сетка данных отображает данные для моих пользователей, где они могут выбирать отдельные строки в сетке данных и передавать их в мой бэкэнд с помощью вызова API.

В вызове API мне нужно передать массив значений, которые я собираю из какой-либо выбранной строки. Когда я вывожу свой массив на консоль, все так, как я и ожидаю. Тем не менее, когда я помещаю его в JSON.stringify(), массив становится пустым.

Почему это происходит? Как я ожидаю, результат будет выглядеть так: { 'LoadContextIds': [1,2,3], "ReportingCobid": "20190119"}.

Моя логика вышеизложенного выглядит следующим образом:

function runBatchWithLoadContexts() {
    var data = [];

    getDataGridInstance().getSelectedRowsData().done(function (rowData) {
        for (var i = 0; i < rowData.length; i++) {
            data.push(rowData[i].LoadContextId);
        }
    });

    var obj = { 'LoadContextIds': data, "ReportingCobid": cobDate };
    console.log(data);
    console.log(JSON.stringify(obj));

}  

И прикрепленный фрагмент из моего console.log, также показывающий вышеупомянутые результаты. Верхняя строка - это выходной формат `data ', а нижняя - результат его строкового преобразования. enter image description here

Ответы [ 2 ]

2 голосов
/ 06 ноября 2019

Из того, что я мог сказать (кратко взглянув на документы devexterme), .done является асинхронным. Итак, ваш цикл for выполняется, и массив data заполняется, после журналов вашей консоли. Это объясняет, почему console.log(JSON.stringify(obj)); показывает пустой массив.

Однако в журналах консоли фактически печатаются живые объекты, которые можно обновлять по мере обновления самих объектов. Это объясняет, почему console.log(data); печатает непустой массив.

Держу пари, если вы добавите console.log(JSON.stringify(data)), это тоже будет пустой массив.

1 голос
/ 06 ноября 2019

Все, что сказал @junvar, верно, и если вы создадите ваш объект внутри функции done после цикла for, все данные будут там.

функция runBatchWithLoadContexts () {var data = [];

getDataGridInstance().getSelectedRowsData().done(function (rowData) {
    for (var i = 0; i < rowData.length; i++) {
        data.push(rowData[i].LoadContextId);
    }
    let obj = { 'LoadContextIds': data, "ReportingCobid": cobDate };
    console.log(data);
    console.log(JSON.stringify(obj));
});

}

...