Kevindra
Kevindra

Reputation: 1762

Make FB.api() calls synchronous

I am creating fQuery API on top of FB javascript SDK. And till now everything worked fine, but i got stuck in FB.api calls now.

Actually, I am trying to load facebook user object i.e. "/me" using FB.api function.

function somefunc() {
  var r = fQuery.load(selector);  //selector = "me"
  return r;
}


fQuery.load = function( selector )  {
  fQuery.fn.response = "";

  return FB.api( "/" + selector, function (response) {
    // we get response here.
  });
}

Is it possible to return the response or can we make it sync call. I have tried many ways to work around but could not get success.

Please provide suggestions.

Upvotes: 7

Views: 12216

Answers (4)

Alasdair McLeay
Alasdair McLeay

Reputation: 2642

As commented elsewhere, making a synchronous call is useful if you want to open a popup after a successful response as browsers will often block popups that aren't a result of a direct user action.

You can do this by manually calling the Open Graph API with JavaScript (or jQuery as per the example below) rather than using the Facebook JS SDK.

e.g. to upload a photo via the Open Graph API and then prompt the user to add it as their profile picture using a popup, without the popup being blocked:

$.ajax({
    type: 'POST',
    url: 'https://graph.facebook.com/me/photos',
    async: false,
    data: {
        access_token: '[accessToken]',//received via response.authResponse.accessToken after login
        url: '[imageUrl]'
    },
    success: function(response) {
        if (response && !response.error) {
            window.open('http://www.facebook.com/photo.php?fbid=' + response.id + '&makeprofile=1');
        }
    }
});

Upvotes: 4

Salik
Salik

Reputation: 468

You probably want to call FB.api in a for loop iteration if this is the case you need its proper solution which exists in the use of Closures. Please read my answer here, given in another question

Upvotes: -1

Martin Jespersen
Martin Jespersen

Reputation: 26183

If you think about it, you don't really want to make it synchronous. Javascript is single threaded by nature, making something that is asynchronous synchronous, would involve "freezing" the thread until the asynchronous call returns.

Even if you could do it, you don't want to, trust me.

Redesign your code to work with the asynchronous nature instead of fighting it. you will create better applications, have happier users and become a better coder all at the same time.

Upvotes: 8

hey there
hey there

Reputation: 1

My solution was to make a recursive call until i got what i need from the FB.api

Upvotes: -8

Related Questions