由于异步功能,javascript无法分配变量值。

时间:2013-08-12 20:06:45

标签: javascript

在我下面的JavaScript代码中,我无法让user_likes获取响应的值。我可以控制台输出“响应”,它具有我需要的值。但是,当我尝试控制台输出user_likes时,我得到了未定义。是什么给了什么?

function fqlUserLikes(user_id) {
    var user_likes;
    FB.api(
        {
            method: 'fql.query',
            query: 'SELECT page_id,name,type FROM page WHERE page_id IN (SELECT page_id FROM page_fan WHERE uid=' + user_id + ')'
        },
        function(response) {
            user_likes=response;
        }
    );
    Console.log(user_likes);
    return user_likes;
}

感谢您的帮助, 在。

2 个答案:

答案 0 :(得分:1)

您的方法是异步的,因此当您尝试记录并返回变量时,它实际上尚未分配。请看下面的代码:

//Do what you need to do in here!
function(response) {
    user_likes=response;
});

//The below code is executed before the callback above.
//Also, it should be console, and not Console. JS is case sensi.
Console.log(user_likes);
return user_likes;

答案 1 :(得分:1)

不会立即调用更改user_likes值的函数。 FB.api()启动调用API的过程,然后返回。此时您的console.log()调用会发生,然后您的函数会将user_likes值返回给其调用者。然后,在稍后的某个时刻,api调用完成,调用您的回调函数,并将user_likes设置为适当的值。不幸的是,没有什么可以读取这个价值。

您需要完全重构代码才能使其正常工作。 Javascript并不支持在代码中间等待事情发生;这是一种非常异步的语言。最好的方法是,如果你传递一个实际使用新值的回调函数,而不是试图将它存储在一个变量中以供其他东西阅读。