У меня есть следующий код в файле js.
firebase.initializeApp({
apiKey: "AXxxxXXxXxXxx0_iDxXXXXxxXXXXXnU",
authDomain: "xxxxx.firebaseapp.com",
databaseURL: "https://xxxxx.firebaseio.com",
projectId: "xxxxxx",
storageBucket: "xxxxxx.appspot.com",
messagingSenderId: "0000000000000",
appId: "1:000000000000:web:f0000eadb00000f"
});
var db = firebase.firestore();
function milogin(pCorreo,pClave){
var estado = false;
console.log('Entro al loginDat');
var elCorreo = pCorreo;
var laClave = pClave;
var docRef = db.collection("usuarios").doc(elCorreo);
docRef.get().then(function(doc) {
console.log('Entro al metodo get');
if (doc.exists) {
console.log('Entro a encontro el correo');
if(doc.data().clave == laClave){
console.log('Entro a la contraseña válido');
var toastHTML = '<span>Bienvenido</span>';
//M.toast({html: toastHTML});
console.log("verdadero de la contraseña");
estado = true;
}
else{
var toastHTML = '<span>Datos no válidos</span>';
M.toast({html: toastHTML});
}
} else {
var toastHTML = '<span>Datos no válidos</span>';
M.toast({html: toastHTML});
}
}).catch(function(error) {
console.log("Error getting document:", error);
});
console.log('Salio al login');
return estado;
}
Проблема, которая у меня есть, когда я называю функцию, состоит в том, что сначала работают линии:
var estado = false;
console.log('Entro al loginDat');
var elCorreo = pCorreo;
var laClave = pClave;
console.log('Salio al loginDat');
до тех пор, пока он не заканчивает функцию выполняют следующих
docRef.get().then(function(doc) {
console.log('Entro al metodo get');
if (doc.exists) {
console.log('Entro a encontro el correo');
if(doc.data().clave == laClave){
console.log('Entro a la contraseña válido');
var toastHTML = '<span>Bienvenido</span>';
//M.toast({html: toastHTML});
console.log("verdadero de la contraseña");
}
else{
var toastHTML = '<span>Datos no válidos</span>';
M.toast({html: toastHTML});
}
} else {
var toastHTML = '<span>Datos no válidos</span>';
M.toast({html: toastHTML});
}
}).catch(function(error) {
console.log("Error getting document:", error);
});
Тогда, когда на моей странице php я выполняю функцию milogin, всегда он возвращает меня false; хотя login будет действительным (уже протестировано, что делает login с firebase) когда бы то ни было, он возвращает меня истинный, из-за которого он заканчивает функцию, но возвращает меня фальшиво, после, что возвращает меня фальшиво, выполняет блок, который делает консультацию в firebase, но как функция уже закончилась он не добивается меня возвращаться истинный.
Желанный Хосе... То, за чем оно последует, идет дальше: ошибки c¦digo (окончательно это не ошибка c¦digo), а концепции, которая применяется в твоем случае. Его зовут asincronismo. Ваша концепция bÃ: sico - следующий:
programaci¦n as¦-ncrona дает нам способность â diferirâ ejecuci¦n funci¦n в ожидании того, что будет завершен operaci¦n , обычно I/O (сеть, жесткий диск, â ¦), и asà - избегать блокировать ejecuci¦n до тех пор, пока не будет завершено задание в cuesti¦n. Это возможное благодаря тому, что функции - граждане первого уровня (first-class citizens) и могут быть перемещенными как аргументы других функций, такой который har¦-хозяева с переменными.
Весь твой c¦digo довольно структурирован, и естественно инструкции выполняют линию из-за линии, "обычно" вот то, за чем оно последует. Но концепция asincronismo, которую я сделал menci¦n (в твоем случае) использует обещания.
Делая встречу в определение обещаний:
Обещания - soluci¦n, чтобы помогать c¦digo as¦-ncrono, что он появляется с целью заменять callbacks. В существо abstracci¦n mÃ: s передовой пост, обещания позволяют такие операции как надеяться на то, что различные операции as¦-ncronas заканчивают работать конкурирующим способом , улучшают читабельность c¦digo и облегчают управление ошибок. Окончательно, это не просто мода но también они вносят соперничающие преимущества напротив callbacks.
Повторяя то, о чем он упоминает ранее, инструкции выполняют "обычно" линию из-за линии, Закончи выполнять одну и происходи со следующей, и со следующей, и со следующей... и asà - последовательно.
, Но который llegar¦ - чтобы в перемещать, если instrucci¦n будет медлить с тем, чтобы работать слишком много?
Давайте Помнить, что firebase - полная платформа много интересных функций, как например удостоверение, hosting, хранение, и в твоем случае, базе данных , эта база данных может или не опаздывать (удовлетворительно или не) некое время в ответе в зависимости от многих факторов, как которые такими сложными являются реализованный запрос, твоя пропускная способность, количество данных, что vendrÃ: n с твоим ответом, estrés того же сервера, и т.д. Костлявые
, имея в виду обычное использование этого, если бы эти инструкции работали обычной формы (или СИНХРОННЫЕ ) habr¦ - в некие недостатки с временами ответов, и в таком случае también какие-то меньшие осложнения во время проверения, что реализованный запрос был tra¦-do разыскиваемые данные (или не).
Возможный soluci¦n для этого случая и asà - предотвращать это время ожидания - aplicaci¦n этой концепции, в которой позволяет, что однажды le¦ - он дает этот instrucci¦n, он этот реализовывая в loop событий, и параллельно продолжили выполнять demÃ: s инструкции без того, чтобы предыдущая блокировала функционирование программы. но он не заканчивает ahÃ, - как только instrucci¦n, который ввел этот loop событий, заключил с Вашим запросом, этот responderÃ: немедленно с ответом (удовлетворительная или не) después последнего instrucci¦n, который работал, не импортируя, что эта былась le¦-do много раньше...
, Чтобы округлять: imag¦-nate, который aquà - не импортирует который instrucci¦n, работал сначала, а тот, кто отвечает сначала
Сейчас, если, если мы видим твой c¦digo в Firebase:
function milogin(pCorreo,pClave){
var estado = false;
console.log('Entro al loginDat');
var elCorreo = pCorreo;
var laClave = pClave;
var docRef = db.collection("usuarios").doc(elCorreo);
docRef.get().then(function(doc) { // <------ LINEA MUUUY IMPORTANTE
console.log('Entro al metodo get');
if (doc.exists) {
console.log('Entro a encontro el correo');
if(doc.data().clave == laClave){
console.log('Entro a la contraseña válido');
var toastHTML = '<span>Bienvenido</span>';
//M.toast({html: toastHTML});
console.log("verdadero de la contraseña");
estado = true;
}
else{
var toastHTML = '<span>Datos no válidos</span>';
M.toast({html: toastHTML});
}
} else {
var toastHTML = '<span>Datos no válidos</span>';
M.toast({html: toastHTML});
}
}).catch(function(error) { // <------- OTRA LINEA IMPORTANTE
console.log("Error getting document:", error);
});
console.log('Salio al login');
return estado;
}
F¦-jate, которые он комментировал бы две линии твоего c¦digo: начиная с этой линии используют Обещания:
, Поскольку мы замечаем?
Из-за использования этих функций .then () и catch () . Funci¦n then () возвращает ответ с данными в то время как funci¦n catch () выполняет в случае, если будет algún тип ошибки.
, Если мы это анализируем, как только переводчик читает функцию then () , automÃ: ticamente env¦ - в и последуй за этим упомянутым event loop, выполняя остальные инструкции, не для него импортируя все, что опоздало... конечно, когда он закончит работать, будет работать то, что у этой функции будет внутри:
docRef.get().then(function(doc) { // <---
// instrucciones...
...
...
...
})
очень сложный для того, чтобы эта концепция быть объясненной посредством простого ответа, из-за более экспрессивного и ясного, что мы были..., но существует much¦-пропасть documentaci¦n на этом, что ты podrÃ: помогать понимать это...
оставил Тебе эту ссылку, которая достаточно ясная на, как это Ваше функционирование.
Espero будьте твоей помощи...