Массив Javascript пуст при использовании в JSON.stringify

В моем проекте используется Dev Extreme и его компонент datagrid. Эта сетка данных отображает данные для моих пользователей, где они могут выбирать отдельные строки в сетке данных и передавать их на мой сервер через вызов 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', а нижняя - результат его преобразования в строку. введите здесь описание изображения


person N0xus    schedule 06.11.2019    source источник


Ответы (2)


Все, что сказал @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));
});

}

person Ivan Mihaylov    schedule 06.11.2019

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

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

Бьюсь об заклад, если вы добавите console.log(JSON.stringify(data)), это тоже будет пустой массив.

person junvar    schedule 06.11.2019