2010-03-08 15 views
19

Estoy usando la función jQuery $ .ajax(). He puesto esto en una función primaria, que pasa algunos valores a la función ajax. Lo que me gustaría hacer es tener una función de devolución de llamada definida por el usuario, que obtenga el parámetro de datos pasado desde la función de éxito de Ajax.

Aquí es lo que pensaba iba a funcionar, pero no lo es:

testFunc = function(str, callback) { 
    // Send our params 
    var data = 'some data to send'; 
    $.ajax({ 
     type: 'POST', 
     url: 'http://www.myurl.com', 
     data: data, 
     success: callback 
    }); 
} 

entonces yo quiero ser capaz de llamar a esa función, y pasar en mi función personalizada para que pueda utilizar las funciones de éxito los datos desde el interior de esa función:

testFunc('my string data', function(data){ 
    alert(data); 
}); 

estoy deseando que esto es lo mismo que:

testFunc = function(str, callback) { 
    // Send our params 
    var data = 'some data to send'; 
    $.ajax({ 
     type: 'POST', 
     url: 'http://www.myurl.com', 
     data: data, 
     success: function(data) { 
      alert(data); 
     } 
    }); 
} 
+0

son ¿Seguro que estás obteniendo un "éxito"? – Jeremy

+0

Sí, estoy obteniendo algunos datos a través del "éxito". –

Respuesta

29

funciona bien para mí:

<script src="/jquery.js"></script> 
<script> 
var callback = function(data, textStatus, xhr) 
{ 
    alert(data + "\t" + textStatus); 
} 

var test = function(str, cb) { 
    var data = 'Input values'; 
    $.ajax({ 
     type: 'post', 
     url: 'http://www.mydomain.com/ajaxscript', 
     data: data, 
     success: cb 
    }); 
} 
test('Hello, world', callback); 
</script> 
+0

No estoy seguro de lo que me faltaba, pero siguiendo su ejemplo, funcionó perfectamente. Gracias! –

1

Creo que su problema es que está de paso TestFunct una cadena, y no un objeto función, (es eso posible?)

1

Aunque no estoy 100% seguro lo que quiere (probablemente mi cerebro es lento en la actualidad), aquí es un ejemplo de un uso similar a lo que usted describe:

function GetProcedureById(procedureId) 
{ 
    var includeMaster = true; 
    pString = '{"procedureId":"' + procedureId.toString() + '","includeMaster":"' + includeMaster.toString() + '"}'; 
    $.ajax({ 
     type: "POST", 
     contentType: "application/json; charset=utf-8", 
     data: pString, 
     datatype: "json", 
     dataFilter: function(data) 
     { 
      var msg; 
      if (typeof (JSON) !== 'undefined' && 
        typeof (JSON.parse) === 'function') 
       msg = JSON.parse(data); 
      else 
       msg = eval('(' + data + ')'); 
      if (msg.hasOwnProperty('d')) 
       return msg.d; 
      else 
       return msg; 
     }, 
     url: "webservice/ProcedureCodesService.asmx/GetProcedureById", 
     success: function(msg) 
     { 
      LoadProcedure(msg); 
     }, 
     failure: function(msg) 
     { 
      // $("#sometextplace").text("Procedure did not load"); 
     } 
    }); 
}; 
/* build the Procedure option list */ 
function LoadProcedure(jdata) 
{ 
    if (jdata.length < 10) 
    { 
     $("select#cptIcdProcedureSelect").attr('size', jdata.length); 
    } 
    else 
    { 
     $("select#cptIcdProcedureSelect").attr('size', '10'); 
    }; 
    var options = ''; 
    for (var i = 0; i < jdata.length; i++) 
    { 
     options += '<option value="' + jdata[i].Description + '">' + jdata[i].Description + ' (' + jdata[i].ProcedureCode + ')' + '</option>'; 
    }; 
    $("select#cptIcdProcedureSelect").html(options); 
}; 
2

En el primer bloque de código, nunca se está utilizando el parámetro str. ¿Quisiste decir lo siguiente?

testFunc = function(str, callback) { 
    $.ajax({ 
     type: 'POST', 
     url: 'http://www.myurl.com', 
     data: str, 
     success: callback 
    }); 
} 
2

esto es cómo lo hago

function run_ajax(obj) { 
    $.ajax({ 
     type:"POST", 
     url: prefix, 
     data: obj.pdata, 
     dataType: 'json', 
     error: function(data) { 
      //do error stuff 
     }, 
     success: function(data) { 

      if(obj.func){ 
       obj.func(data); 
      } 

     } 
    }); 
} 

alert_func(data){ 
    //do what you want with data 
} 

var obj= {}; 
obj.pdata = {sumbit:"somevalue"}; // post variable data 
obj.func = alert_func; 
run_ajax(obj); 
+0

Estoy seguro de que no declara por separado propiedades de objeto como las de un caso de uso simple, ¿por qué no utiliza un literal de objeto? '{" pdata ": {" submit ":" somevalue "}," func ": alert_func}' ¿Puedo preguntar qué efecto (si tiene alguno) tiene en GC en JS? – MrMesees

21

Usted puede utilizar esta palabra clave para acceder a los datos personalizados, pasaron a $ .ajax() función:

$.ajax({ 
     // ... // --> put ajax configuration parameters here 
     yourCustomData: {param1: 'any value', time: '1h24'}, // put your custom key/value pair here 
     success: successHandler 
    }); 

    function successHandler(data, textStatus, jqXHR) { 
     alert(this.yourCustomData.param1); // shows "any value" 
     console.log(this.yourCustomData.time); 
    } 
+0

Esta es una forma agradable y limpia de hacerlo que no implica la creación de nuevas funciones. ¡Gracias! – Acyra

Cuestiones relacionadas