¿Cómo guardar las devoluciones de responseText de GM_xmlhttpRequest?

Lo intenté:

GM_xmlhttpRequest({
    method: "GET",
    url: "...",
    onload: function(response) {
        r = response.responseText;

    }});
alert(r); //undefined 

¿Cómo hacer esto?

preguntado el 27 de agosto de 11 a las 21:08

1 Respuestas

Por que esta pasando esto

De forma predeterminada, las solicitudes ajax que utilizan XMLHTTPRequest son asincrónicas. Esto significa que la llamada al método regresa inmediatamente y la ejecución principal continúa mientras la solicitud continúa en segundo plano. Cuando se complete la solicitud, se invocará el método de devolución de llamada con los resultados de la solicitud. Por lo tanto, su alerta se ejecuta antes de que se complete la solicitud (asincrónica).

Solución 1: devoluciones de llamada

No ha proporcionado un contexto sobre por qué necesitaría el texto de respuesta de forma sincrónica, por lo que es posible que pueda reescribir su código para usar devoluciones de llamada y continuar usando el comportamiento asincrónico; esto suele ser una buena práctica.

Solución 2: Forzar solicitudes sincrónicas

Sin embargo, si descubre que es absolutamente necesario realizar solicitudes de forma sincrónica, encontrará que puede solicitar que la solicitud ajax se realice de forma sincrónica. Con Greasemonkey, debes usar la opción synchronous: true al invocar GM_xmlhttpRequest, ya que documentado aquí. Tenga en cuenta que los documentos dicen que

Tenga cuidado: toda la interfaz de usuario de Firefox se bloqueará y congelará hasta que se complete la solicitud. En este modo, habrá más datos disponibles en el valor de retorno.

Con objetos XHR en el navegador, obtendría los mismos resultados al paso false como segundo parámetro para XMLHTTPRequest#open.

Si está trabajando con una versión anterior de Greasemonkey, las respuestas a esta pregunta SO pueden resultar útiles: ¿Cómo hacer llamadas AJAX sincrónicas en greasemonkey?

contestado el 23 de mayo de 17 a las 15:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.