Делать вызовы FB.api () синхронными - PullRequest
7 голосов
/ 09 марта 2011

Я создаю fQuery API поверх javascript SDK FB.И до сих пор все работало нормально, но я застрял в вызовах FB.api.

На самом деле, я пытаюсь загрузить пользовательский объект facebook, т.е. "/ me", используя функцию FB.api.

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

Можно ли вернуть ответ или мы можем сделать его синхронизированным вызовом.Я перепробовал много способов обойти, но не смог добиться успеха.

Пожалуйста, предоставьте предложения.

Ответы [ 4 ]

8 голосов
/ 09 марта 2011

Если вы думаете об этом, вы не хотите делать это синхронно. Javascript по своей природе является однопоточным, делая что-то асинхронное синхронным, что потребует «замораживания» потока до тех пор, пока не вернется асинхронный вызов.

Даже если бы ты мог это сделать, ты не хочешь, поверь мне.

Переработайте ваш код, чтобы он работал с асинхронной природой, а не боролся с ней. Вы будете создавать лучшие приложения, иметь более счастливых пользователей и одновременно становиться лучшим программистом.

4 голосов
/ 11 февраля 2014

Как отмечалось в другом месте, синхронный вызов полезен, если вы хотите открыть всплывающее окно после успешного ответа, поскольку браузеры часто блокируют всплывающие окна, которые не являются результатом прямого действия пользователя.

Сделайте это, вызвав API Open Graph с помощью JavaScript (или jQuery, как в примере ниже), а не с помощью JS SDK Facebook.

, например, чтобы загрузить фотографию через API Open Graph, а затем предложить пользователюдобавьте его в качестве картинки профиля, используя всплывающее окно, без блокировки всплывающего окна:

$.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');
        }
    }
});
0 голосов
/ 04 мая 2013

Возможно, вы захотите вызвать FB.api в итерации цикла for, если в этом случае вам нужно его правильное решение, которое существует при использовании Closures . Пожалуйста, прочитайте мой ответ здесь , данный в другом вопросе

0 голосов
/ 01 июля 2011

Мое решение было сделать рекурсивный вызов, пока я не получил то, что мне нужно от FB.api

...