等待异步结果

时间:2011-12-21 15:40:52

标签: jquery facebook asynchronous

我厌倦了以下问题:

我使用facebook函数FB.api()在Facebooks API中查询某些权限。我想在继续进行一些测试之前等待结果。我的目标是创建一个小助手类来调用这个类经常使用的函数:

var fbHelper = {

    hasPermission: function(permission) {

            var hasPermission = false;
            var requestedPermissions = false;
            var permissions = { };

            FB.api('/me/permissions', function(response){    

                permissions = response;
                requestedPermissions = true;
                return response;
            });

            if(permissions){
                // make some checking stuff here
                return hasPermission;
            } else {
                console.log('failed to /me/permissions');
                return false;
            }        
     }
}

所以我想使用fbHelper.hasPermission('dummy')。不幸的是if(permissions)FB.Api()完成之前就已经开始了。 在Api-Call完成之前,如何等待其余的代码?

3 个答案:

答案 0 :(得分:1)

您无法真正编写执行异步请求的函数,并期望能够可靠地返回结果。我会按如下方式重构您的帮助方法:

hasPermission: function(permission, callback) {

        var hasPermission = false;
        var requestedPermissions = false;
        var permissions = { };

        FB.api('/me/permissions', function(response){    

            permissions = response;
            requestedPermissions = true;
            if (permissions) {
                callback(permissions);
            } else {
                callback(false);
            }
        });     
 }

让调用代码提供一个在AJAX调用完成时执行的回调函数。

答案 1 :(得分:1)

您应该将代码移动到回调中并从那里返回:

return FB.api('/me/permissions', function(response){    
    // this is your callback
    permissions = response;
    requestedPermissions = true;
    if(permissions){
        // make some checking stuff here
        return hasPermission;
    } else {
        console.log('failed to /me/permissions');
        return false;
    }      
});

答案 2 :(得分:0)

如果异步你需要回调,就像你有function(response){}一样。 javascript不等待调用结束的事实是异步调用的全部目的。