Как назначить ответы на запрос для global.arrays, а не значение в массиве global.arrays? - PullRequest
1 голос
/ 29 сентября 2019

ВОПРОС:

Я пытаюсь присвоить глобальным массивам результаты запросов к моей базе данных MongoDB.По сути, я пытался хранить ссылки на глобальные массивы внутри массива, чтобы я мог назначить всем им результаты запросов внутри цикла for.

Это представляется невозможным.Что бы вы предложили?


КОД:

    var arrays = [global.array1, global.array2, global.array3];

    var colsArray = ["array1","array2","array3"];

    var promises = colsArray.map(col => global.fetchCollection(col));

    Promise.all(promises).then(responses => {

        for (var d = 0; d < responses.length; d++) {
            arrays[d] = responses[d];
        } 

        console.log("VALUE INSIDE ARRAY of global.arrays: "+arrays[0]);
        console.log("VALUE OF global.array is still : "+global.array1);

    })

ВЫХОД:

VALUE INSIDE ARRAY of global.arrays:: [object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
VALUE OF global.array is still : undefined

Примечание:

Это сработает, конечно.Но совершенно неудовлетворительно, конечно:

        var arrays = [global.array1, global.array2, global.array3];

        var colsArray = ["array1","array2","array3"];

        var promises = colsArray.map(col => global.fetchCollection(col));

        Promise.all(promises).then(responses => {

                global.array1 = responses[0];
                global.array2 = responses[2];
                global.array3 = responses[3];

        })

РЕДАКТИРОВАТЬ:

Это не работает:

    var arrays = [global.array1, global.array2, global.array3];

    var colsArray = ["array1","array2","array3"];

    var promises = colsArray.map(col => global.fetchCollection(col));

    Promise.all(promises).then(responses => {

        for (var d = 0; d < responses.length; d++) {
            arrays[colsArray[d]] = responses[d];
        } 

        console.log("VALUE INSIDE ARRAY of global.arrays: "+arrays[0]);
        console.log("VALUE OF global.array is still : "+global.array1);

    })

1 Ответ

2 голосов
/ 29 сентября 2019

Когда вы делаете это:

var arrays = [global.array1, global.array2, global.array3];

вы копируете значение в global.array1 и т. Д. В arrays.Это значение называется ссылкой на объект.Он сообщает движку JavaScript, где находится массив, в другом месте в памяти.Между arrays[0] и global.array1 нет постоянной связи (например);оба они содержат одно и то же значение.

Ваш код заменяет значения в arrays.Это никак не влияет на global.array1 и т. Д.

Если у вас действительно есть объект с именем global, то вы можете индексировать его с помощью скобок (см. ответы на этот вопрос )на самом деле изменить значение global.array1 следующим образом:

for (var d = 0; d < responses.length; d++) {
    global["array" + (d + 1)] = responses[d];
} 

Live Пример:

var global = {
    fetchCollection(col) {
        return new Promise(resolve => {
            setTimeout(() => {
                resolve("Response for " + col);
            }, Math.floor(Math.random() * 800));
        });
    }
};

var colsArray = ["array1", "array2", "array3"];

var promises = colsArray.map(col => global.fetchCollection(col));

Promise.all(promises).then(responses => {
    for (var d = 0; d < responses.length; d++) {
        global["array" + (d + 1)] = responses[d];
    } 

    console.log("VALUE OF global.array1 is : " + global.array1);

});

Или, если имена не являются числовыми, вы можете использовать colsArray, чтобы получить имя:

for (var d = 0; d < responses.length; d++) {
    global[colsArray[d]] = responses[d];
} 

Live Example:

var global = {
    fetchCollection(col) {
        return new Promise(resolve => {
            setTimeout(() => {
                resolve("Response for " + col);
            }, Math.floor(Math.random() * 800));
        });
    }
};

var colsArray = ["array1", "array2", "array3"];

var promises = colsArray.map(col => global.fetchCollection(col));

Promise.all(promises).then(responses => {
    for (var d = 0; d < responses.length; d++) {
        global[colsArray[d]] = responses[d];
    } 

    console.log("VALUE OF global.array1 is : " + global.array1);

});

Но я настоятельно рекомендую вам вообще не использовать глобалы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...