Porqué методы firebase внутри функции js работают, закончив функцию

У меня есть следующий код в файле 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, но как функция уже закончилась он не добивается меня возвращаться истинный.

3
задан 01.07.2019, 23:06
1 ответ

Желанный Хосе... То, за чем оно последует, идет дальше: ошибки 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 будьте твоей помощи...

2
ответ дан 11.11.2019, 04:02

Теги

Похожие вопросы