【问题标题】:javascript assigning value to variable from callback return (timing)javascript从回调返回(计时)为变量赋值
【发布时间】:2014-09-06 07:22:50
【问题描述】:

我在将 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 firebase firebasesimplelogin


    【解决方案1】:

    欢迎使用 JavaScript 进行异步编程。

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

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

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

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

    浏览器不会阻塞应用程序,而是将调用服务器转为后台活动。你传入一个函数,它会在后台活动完成时调用。就像您注册 FedEx 的递送通知一样。如果包裹已经在那里,您不必在前门检查包裹,而是会在包裹被丢弃时收到一条短信。

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

    在您的情况下,您可以通过将回调函数传递给您 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);
    });
    

    【讨论】:

    • 如果我将相同的代码粘贴到我的代码中,为什么我的错误报告者会报告 [Error] TypeError: undefined is not a function (evalating 'callback(path.name)')?
    • 很遗憾,我无法为您调试您的应用程序。我建议在这一行设置断点callback(path.name()); 看看会发生什么。
    • 我找到了!当函数再次调用自身时,我的代码不好。未定义回调
    【解决方案2】:
    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 ); //here was the error
                })
            }else{
                //finishes the function when path is founded - returns the value
                callback(path.name());
            }       
        })
    }
    
    getThePushNameById( base, 2, function(output) {
        console.log(output);
    });
    

    发现一个错误:当函数再次调用自己时,回调没有重新定义,所以它返回了一个未定义的。这段代码现在可以正常工作了

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-07
      • 2013-05-27
      • 2012-09-08
      • 2014-10-12
      • 1970-01-01
      • 2017-11-18
      • 1970-01-01
      相关资源
      最近更新 更多