javascript从回调返回给变量赋值(计时)

标签 javascript firebase firebasesimplelogin

我在将 Firebase 调用函数的返回值分配给全局变量时遇到问题。这是我的功能:

  function getThePushNameById( path , id ){
    path.once( 'value', function( data ){ 
        if( data.child('id').val() != id ){
            data.forEach( function( newData ){
                var base = new Firebase( path.child( newData.name() ).toString() );
                getThePushNameById( base, id );
            })
        }else{
            //finishes the function when path is founded - returns the value
            return path.name();
        }       
    })
}

这是我设置请求的另一个文件:

var base = new Firebase(path/to/my/base);

var output = getThePushNameById( base , 2 )
console.log(output);

所以我的问题是 console.log 不会等待 output 被定义,而是自行运行并记录 undefined。我的问题是,是否有人知道如何让 console.log 等待值?

最佳答案

欢迎使用 JavaScript 异步编程。

当我们查看您的主要代码时:

var output = getThePushNameById( base , 2 )
console.log(output);

然后,您(逻辑上)假设 getThePushNameById 将在执行 console.log 语句之前完成。

不幸的是,当我们针对服务器进行编程时,这个假设是错误的。在您的情况下,getThePushNameById 会联系 Firebase,这可能需要很长时间才能完成。如果浏览器只是等待调用完成,则整个应用程序将被阻止。

浏览器不会阻止应用程序,而是将对服务器的调用转入后台事件。并且您传入一个函数,当后台事件完成时它将调用该函数。这就像您注册联邦 express 的递送通知一样。您不必在前门检查包裹是否已经在那里,而是在包裹投递后收到一条短信。

这种在完成后调用你的生成背景工作方法对于大多数现代网络来说都是必不可少的。你最好尽早接受它,而不是试图反对它。

在您的情况下,您可以通过将回调函数传入 getThePushNameById 并在收到来自 Firebase 的值时调用该函数来接受它:

function getThePushNameById( path , id, callback ){
    path.once( 'value', function( data ){ 
        if( data.child('id').val() != id ){
            data.forEach( function( newData ){
                var base = new Firebase( path.child( newData.name() ).toString() );
                getThePushNameById( base, id, callback );
            })
        }else{
            //finishes the function when path is founded - returns the value
            callback(path.name());
        }       
    })
}

getThePushNameById( base, 2, function(output) {
    console.log(output);
});

关于javascript从回调返回给变量赋值(计时),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25697907/

相关文章:

javascript - Webpack ES6-使用动态导入加载 Json(保留 json 文件)

JavaScript:字符串化循环引用对象的浅拷贝?

javascript - 使用 AJAX 在 ASP.NET MVC 中的返回结果中突出显示搜索词

swift - 如何从 Firebase 实时数据库 (Swift) 检索数据

javascript - Firebase 用户已登录

error-handling - Firebase简单登录仅引发 'INVALID_EMAIL'错误

javascript - 使用javascript根据json值更改表格单元格背景颜色

javascript - Ionic FCM wasTapped 始终为 false

javascript - Firebase 简单登录 - 新电子邮件未注册到 Firebase

javascript - 如何将 unix 时间戳转换为 firebase 中的格式化日期字符串