7

Estoy creando API fQuery en la parte superior de FB javascript SDK. Y hasta ahora todo funcionó bien, pero me quedé atrapado en las llamadas de FB.api ahora.Hacer llamadas FB.api() sincrónicas

En realidad, estoy tratando de cargar el objeto de usuario de Facebook, es decir "/ me" usando la función 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. 
    }); 
} 

Es posible devolver la respuesta o podemos realizar una llamada de sincronización. He intentado muchas formas de trabajar pero no he tenido éxito.

Por favor, brinde sugerencias.

Respuesta

8

Si lo piensas bien, realmente no quieres que sea sincrónico. Javascript es de un solo subproceso por naturaleza, lo que hace que algo que es asincrónico sincrónico, implicaría "congelar" el hilo hasta que regrese la llamada asincrónica.

Incluso si pudieras hacerlo, no quieres, créeme.

Rediseña tu código para trabajar con la naturaleza asincrónica en lugar de luchar contra él. creará mejores aplicaciones, tendrá usuarios más felices y se convertirá en un mejor codificador, todo al mismo tiempo.

+6

"Argh," Al principio pensé. Odio respuestas como esta que no responden a la pregunta, sino que simplemente digo "hazlo bien" con poca orientación. pero estoy contento de haber seguido tu consejo, resolvió algunos otros problemas. si ayuda a alguien más, tuve que hacer que la función de llamada también fuera asincrónica, y dividir parte del código que se invocaría en una devolución de llamada después de que las operaciones hubieran finalizado. – changokun

+0

No esperaba que esa respuesta fuera la aceptada. Sé que no es recomendable, pero aún así, quería hacerlo de esa manera con la primera llamada. Rediseñar mi código llevará una eternidad. Necesito hacer solo una llamada fb.api específica (que es una llamada muy rápida) sincrónica. Ya había perfilado la llamada y fue muy rápido. –

+0

Hay casos en los que necesita api síncrona, digamos que estoy creando una regla de validación jquery, y necesito consultar el resultado de la API gráfica para saber si es válida o no. ¿Alguna sugerencia sobre cómo rediseñar el código para cumplir con este requisito? –

-5

Mi solución era hacer una llamada recursiva hasta que consiguiera lo que necesito de la FB.api

+5

-1 Eso es simplemente incorrecto: bloqueas la banda de rodadura y eventualmente obtendrás una excepción de desbordamiento de pila. –

+0

Oh Dios, las respuestas que tenemos que ver: D – ErwinGO

-1

Es posible que desee llamar FB.api en un bucle de iteración si este es el caso de que necesite su solución adecuada que existe en el uso de Closures. Lea mi respuesta here, dada en otra pregunta

4

Como se comentó en otra parte, hacer una llamada síncrona es útil si desea abrir una ventana emergente después de una respuesta exitosa ya que los navegadores a menudo bloquearán las ventanas emergentes que no son resultado de una acción del usuario

Puede hacerlo llamando manualmente la API de Open Graph con JavaScript (o jQuery según el ejemplo a continuación) en lugar de utilizar el SDK de JS de Facebook.

p. Ej. subir una foto a través de la API Open Graph y luego pedir al usuario que añadirlo como su foto de perfil usando una ventana emergente, sin el emergente siendo bloqueado:

$.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

acabamos de ver esta publicación y me ayudó, pero la URL actualizada debe comenzar como "https://graph.facebook.com/v2.5/" – chuycepeda

Cuestiones relacionadas