Javascript 安格拉尔火儿童俱乐部补充道

Javascript 安格拉尔火儿童俱乐部补充道,javascript,angularjs,asynchronous,firebase,Javascript,Angularjs,Asynchronous,Firebase,因此,我最近开始使用AngularFire,因为它使后端的使用完全无用 我试图在注册表中查看电子邮件是否已存在。目前firebase中有一个电子邮件地址“xxx”,但是我无法添加第二个条目,因为我一直得到一个未定义的函数。为了澄清,以下是我的控制器中的代码: $scope.submitForm = function (isValid) { if (isValid) { var resolved = checkEmail($scope.add.email)

因此,我最近开始使用AngularFire,因为它使后端的使用完全无用

我试图在注册表中查看电子邮件是否已存在。目前firebase中有一个电子邮件地址“xxx”,但是我无法添加第二个条目,因为我一直得到一个未定义的函数。为了澄清,以下是我的控制器中的代码:

 $scope.submitForm = function (isValid) {
        if (isValid) {
            var resolved = checkEmail($scope.add.email);
            console.log('resolved = ' + resolved);
            if (resolved) {
                console.log('I should be here');
                $scope.addEntry();
            } else if (!resolved) {
                console.log('Am I seriously getting in here ???');
            }
        } else {
            alert('failed!')
        }
    };

var db = new Firebase("https://radiant-fire-1289.firebaseio.com/");

function checkEmail(inputEmail) {
    db.on('child_added', function (snapshot) {
        var data = snapshot.val();
        if (data.email.toUpperCase() === inputEmail.toUpperCase()) {
            return false;
        } else {
            console.log('I am in checkEmail');
            return true;
        }
    })
}
inputEmail显然是我以html格式发送的电子邮件。当提交电子邮件地址“bbb”时,函数正确返回true,它不等于“xxx”。按下submit按钮时,将从表单调用submitForm函数。isValid只是表单的一些验证,它可以正常工作。但是,布尔值“已解析”始终未定义。我有一种感觉,这与异步函数有关,但由于我是javascript(尤其是firebase)的新手,我很难理解我到底做错了什么


控制台在记录“resolved=”+resolved之前会记录“I am in checkEmail”,但resolved会继续打印为未定义而不是true。然后控制台打印“我真的到这里了吗?”,这导致没有添加条目。(我想对于编译器来说,undefined与false是一样的?

上的
函数是异步的。这意味着在对Firebase的远程调用完成之前,不会执行回调。checkEmail函数在获取结果之前已经运行,因此没有返回值。您可以通过在checkEmail结尾之前添加console.log来测试这一点,您会注意到它在“我在checkEmail”日志之前运行

此外,这里存在对范围的误解。在
db内部返回false/true。on
回调不会以某种方式传播到checkEmail,因此checkEmail的结果始终是未定义的,即使这是一个同步调用

要正确执行此操作,您希望在获取结果时调用另一个回调:

$scope.submitForm = function (isValid) {
        if (isValid) {
            var resolved = checkEmail($scope.add.email, function(resolved) {
               console.log('resolved = ' + resolved);
               if (resolved) {
                 console.log('I should be here');
                 $scope.addEntry();
               } else if (!resolved) {
                 console.log('Am I seriously getting in here ???');
               }
            });
        } else {
            alert('failed!')
        }
    };

var db = new Firebase(URL);

function checkEmail(inputEmail, callback) {
    db.on('child_added', function (snapshot) {
        var data = snapshot.val();
        if (data.email.toUpperCase() === inputEmail.toUpperCase()) {
            callback(false);
        } else {
            console.log('I am in checkEmail');
            callback(true);
        }
    })
}
最后但并非最不重要的一点是,您需要了解和。添加的
child\u
事件不会在Angular的编译范围内触发(因为它是异步的),因此如果您对$scope进行了任何更改,则需要使用手动触发编译

请参阅,它将向您介绍正确的集成方法,并提供一个名为angularFire的库,它代表您处理所有这些复杂问题