Как получить доступ к значению вне цикла for - PullRequest
0 голосов
/ 04 июня 2019

Я пытаюсь получить доступ к новому значению переменной вне цикла for.

Это для системы, где пользователи получают баллы каждый раз, когда они перемещают карту в нужный индекс (все хранится в indexedDB).Я уже пытался создать глобальную переменную, но она возвращается к 0, как только я вывожу ее за пределы цикла.Когда я получаю к нему доступ внутри цикла, я вижу новое значение.Мне нужно новое значение для новой функции, которая будет хранить различные значения в порядке убывания (в основном, создание таблицы лидеров).Как теперь выглядит код:

let danielCounter = 0;

for (let i = 1; i < doneTasks.result+1; i++) {
    let getTasks = tasksStore.get(i);

    getTasks.onerror = function() {

    }

    getTasks.onsuccess = function() {
        if (getTasks.result.memberFullName == "Daniel") {
            danielCounter++;
        } else if (condition) {
            //something to be executed;
        }
    }
}

console.log("d: " + danielCounter);

Я бы ожидал, что console.log покажет «d: 5», потому что это то, что будет показано, если console.log находится внутри цикла for, но вместо этогоон показывает «d: 0», то есть значение, с которого он начинается.

Ответы [ 3 ]

0 голосов
/ 04 июня 2019

Вызов tasksStore.get (i), вероятно, выполняется асинхронно, поэтому вы выйдете из цикла до того, как получите все результаты.

Вы можете попытаться дождаться ответа в асинхронной функции, что-то вроде этого

let danielCounter = 0;</p>

<code>getDanielCount();

async function getDanielCount(){
    for (let i = 1; i < doneTasks.result+1; i++) {
        let getTasks = await tasksStore.get(i);

        getTasks.onerror = function() {

        }

        getTasks.onsuccess = function() {
            if (getTasks.result.memberFullName == "Daniel") {
                danielCounter++;
            } else if (condition) {
                //something to be executed;
            }
        }
    }
    console.log("d: " + danielCounter);
}
</code>
0 голосов
/ 05 июня 2019

Есть несколько вещей, которые могут вызвать проблему.

Javascript является однопоточным и имеет модель параллелизма, основанную на «цикле событий». Итак, порядок выполнения вашего кода следующий:

1. let danielCounter = 0;
2.
3. for (let i = 1; i < doneTasks.result+1; i++) {
4.    //taskStore.get is blocking method-- the method pushed into event event 
5.    // The control moves to next unblocked statement -- which is line 20!!
6.    let getTasks = tasksStore.get(i);
7.
8.    getTasks.onerror = function() {
9.
10.    }
11.
12.   getTasks.onsuccess = function() {
13.        if (getTasks.result.memberFullName == "Daniel") {
14.            danielCounter++;
15.        } else if (condition) {
16.            //something to be executed;
17.        }
18.    }
19.}

20. console.log("d: " + danielCounter);

Вместо этого попробуйте этот код


async function  getDanielCount() {

    let danialCount = 0;

    for( i=0; i< tasksStore.length; i++) {
        let getTasks = await tasksStore.get(i);
        if (getTasks.result.memberFullName == "Daniel") {
            danielCounter++;
        } else if (condition) {
            //something to be executed;
        }

    }
    return danialCount;
}

(async () => { 
    let count = await getDanielCount();
    console.log('Daniel count', count); // This should display correct count
})();

Другая вещь, которую я заметил, - tasksStore.get (i) возвращает вам объект 'getTasks', а ваши функции успеха и ошибок являются членами вновь созданного объекта getTask. Обычно вы пишете функцию успеха и неудачи отдельно и передаете функции в метод getTask для получения обратного вызова от функции getTask.

0 голосов
/ 04 июня 2019

Я предполагаю, что, поскольку tasksStore.get(i) является асинхронным вызовом, функция onsuccess вызывается после console.log("d: " + danielCounter); синхронной инструкции называется. Попробуйте подождать пару секунд, чтобы напечатать значение переменной, или поместите console.log внутри onsuccess.

Проверьте эту ссылку для получения дополнительной информации о синхронных и асинхронных процессах.

...