GeoFire: дождитесь ожидающих обещаний - PullRequest
0 голосов
/ 04 мая 2018

Я хочу найти всех людей поблизости, получить некоторую информацию из базы данных Firebase и позже вернуть номер определенного подмножества. На клиенте данные будут загружены из базы данных после того, как сервер отправит свой ответ, поскольку мои результаты сохраняются там и не возвращаются непосредственно серверной функцией. Я делаю это, поэтому я могу получить их в виде упорядоченного списка из базы данных после проверки всех потенциальных людей.

Моя проблема в том, что функция "ready" для geoQuery срабатывает до того, как мои обещания от "key_entered" будут разрешены:

var onKeyEnteredRegistration = geoQuery.on("key_entered", function(key, location, distance) {
        promises.push(new Promise((resolve,reject) => {     
            var someDatabaseCheck = groupRef.child("path1").once("value"); //Promise
            var someDatabaseCheck2 = groupRef.child("path2").once("value"); //Promise
            Promise.all([someDatabaseCheck,someDatabaseCheck2]).then((data) => {
                if(data[1].val()){
                    validSuggestions.push(userRef.child("path3").update(myData); //Promise
                }
            },error => console.error(error));   

            resolve("Done");
        }));
    });


 var onReady = geoQuery.on("ready", function() {
        console.log("GeoQuery rdy");
        return Promise.all(promises).then(() => { //Called before everything is added
            return Promise.all(validSuggestions).then(() => {
                onKeyEnteredRegistration.cancel();
                onKeyEnteredRegistration = undefined;
                onReady.cancel();
                onReady = undefined;
                console.log("Returning result");
                res.status(200).send(""+validSuggestions.length);
            },error => console.error(error));   
        },error => console.error(error));
    });

Поэтому моей следующей идеей было использование триггера "key_entered" для извлечения необходимых данных и сохранения их в массиве. Позже, в "ready", я перебираю массив, все волшебство происходит, и после цикла я делаю вызов Promise.all(...), чтобы убедиться, что все данные обрабатываются.

Но, очевидно, это не так легко решить, так как не все обещания добавляются к promises-array (и таким образом обрабатываются моим вызовом Promise.all(...)), когда цикл заканчивается.

Как это должно работать с новым подходом:

  1. Найдите всех людей поблизости с помощью "key_entered" и добавьте их в массив (обр)
  2. "ready" -Звонок вызывается
  3. Итерация по обр.
  4. Проверьте, выполняет ли человек требования (Обещание А)
  5. Обещание А разрешается, и человек записывается (или нет) в базу данных
  6. Итерация-цикл заканчивается
  7. Возвращается окончательный список и функция отключается

Что происходит с новым подходом:

  1. Найдите всех людей поблизости с помощью "key_entered" и добавьте их в массив (обр)
  2. "ready" -Звонок вызывается
  3. Итерация по обр.
  4. Проверьте, выполняет ли лицо требования (Обещание А)
  5. Итерация-цикл заканчивается
  6. Возвращается окончательный список и функция отключается
  7. Обещание А разрешается, и человек записывается (или нет) в базу данных

Каков типичный способ справиться с этим? Должен ли я выполнять обещания в обратном вызове "ready" или "key_entered"? Кроме того, как я могу гарантировать, что все мои Обещания были выполнены? Может быть, я просто неправильно понимаю некоторые базовые знания об обещаниях.

...