Tengo una función de JavaScript llamada GetRequest () que llama al servidor con $ .ajax () y recibe una cadena json:

function GetRequest(ThePage) {

RequestedPage = parseInt(ThePageNumber,10);

$.ajax({
    type: "POST",
    contentType: "application/json; charset=utf-8",
    url: "../Pages/MyPage.aspx/GetPage",
    data: "{'ThePage':'" + ThePageNumber + "'}",
    dataType: "json",
    success: function (msg) {
        var data = msg.hasOwnProperty("d") ? msg.d : msg;
        OnSucessCallBack(data);
    },
    error: function (xhr, status, error) {
        alert(xhr.statusText);
    }
});

};

Tengo una función llamada ShowData () que llama a GetRequest () y debo esperar hasta que GetRequest reciba sus datos antes de continuar.

function ShowData() {

//some code that determines the page number

GetRequest(ThePageNumber);

//wait until the data is in

};

Uso GetRequest en varios lugares, así que no puedo usar su función de éxito en el contexto de ShowData.

¿Cómo hago que mi función ShowData pause su ejecución hasta que GetRequest haya terminado? Pensé en cambiar la función OnSuccessCallBack y determinar qué función inicialmente se llamó GetRequest (), pero no estoy seguro de cómo hacerlo mejor.

Gracias por sus sugerencias

0
frenchie 6 jul. 2011 a las 07:09

3 respuestas

La mejor respuesta

Agregue una función de paso a GetRequest de la siguiente manera:

function GetRequest(pageNumber, successCallback){

  //I admit this isn't "elegant" but it's most assuredly readable
  var callback;
  if (successCallback == null) {
    callback = //default callback definition here
  } else {
    callback = successCallback;
  }

  //do everything else the same here 
  //except use the callback defined above
}

Esto le brinda la flexibilidad de agregar un controlador de devolución de llamada separado para el éxito

Alternativamente, haga lo mismo que anteriormente, pero use el controlador "onComplete" a menos que necesite los datos específicamente en la declaración (no aparece como lo hace).

Voy a sugerir enérgicamente que use devoluciones de llamada para el código asincrónico en lugar de intentar calzar las solicitudes de sincronización. Es mucho mejor simplemente adoptar un estilo de codificación que gira en torno a las solicitudes asíncronas cuando se trabaja en JavaScript, especialmente cuando ya está haciendo AJAX (que, por definición, está destinado a ser asíncrono).

1
jcolebrand 6 jul. 2011 a las 03:27

Pase async:false junto con las opciones de ajax.

$.ajax({
    type: "POST",
    async:false,
    .
    .
    .
 });
1
Chandu 6 jul. 2011 a las 03:19

Puede hacer que su llamada solo sea síncrona utilizando prefiltros ajax:

function ShowData() {
    //some code that determines the page number
    $.ajaxPrefilter( function( options, originalOptions, jqXHR ) {
        options.async = false;
    });

    GetRequest(ThePageNumber);
    //wait until the data is in
};
1
Mrchief 6 jul. 2011 a las 03:22