Я хочу найти всех людей поблизости, получить некоторую информацию из базы данных 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(...)
), когда цикл заканчивается.
Как это должно работать с новым подходом:
- Найдите всех людей поблизости с помощью
"key_entered"
и добавьте их в массив (обр)
"ready"
-Звонок вызывается
- Итерация по обр.
- Проверьте, выполняет ли человек требования (Обещание А)
- Обещание А разрешается, и человек записывается (или нет) в базу данных
- Итерация-цикл заканчивается
- Возвращается окончательный список и функция отключается
Что происходит с новым подходом:
- Найдите всех людей поблизости с помощью
"key_entered"
и добавьте их в массив (обр)
"ready"
-Звонок вызывается
- Итерация по обр.
- Проверьте, выполняет ли лицо требования (Обещание А)
- Итерация-цикл заканчивается
- Возвращается окончательный список и функция отключается
- Обещание А разрешается, и человек записывается (или нет) в базу данных
Каков типичный способ справиться с этим? Должен ли я выполнять обещания в обратном вызове "ready"
или "key_entered"
? Кроме того, как я могу гарантировать, что все мои Обещания были выполнены? Может быть, я просто неправильно понимаю некоторые базовые знания об обещаниях.