javascript从回调返回(定时)为变量赋值

时间:2014-09-06 07:22:50

标签: 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等待价值?

2 个答案:

答案 0 :(得分:1)

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

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

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

然后你(逻辑上)假设在getThePushNameById语句执行之前console.log已经完成。

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

浏览器不是阻止应用程序,而是将调用服务器转换为后台活动。并传递一个函数,它将在后台活动完成时调用。就像你从联邦快递注册发送通知一样。如果包裹已经存在,您不必在前门检查,而是在包裹被丢弃时收到短信。

这种产生背景的工作 - 即使已经完成的方法也会让你回过头来对大多数现代网络都至关重要。你最好早点接受它而不是试图反对它。

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

答案 1 :(得分:0)

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);
});

发现了一个错误:当函数再次调用自身时,回调没有被定义,所以它返回了一个未定义的。这段代码现在还可以,效果很好