web-dev-qa-db-fra.com

jQuery $ .ajax (), passe les données de réussite dans une fonction séparée

J'utilise la fonction jQuery $ .ajax (). J'ai mis cela dans une fonction parent, qui transmet certaines valeurs à la fonction ajax. Ce que je voudrais faire, c'est avoir une fonction de rappel définie par l'utilisateur, qui récupère les paramètres de données de la fonction de succès ajax.

Voici ce que je pensais fonctionner, mais ce n'est pas le cas:

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

Ensuite, je veux pouvoir appeler cette fonction et transmettre ma fonction personnalisée afin de pouvoir utiliser les données des fonctions de réussite à l'intérieur de cette fonction:

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

Je veux que ce soit le même 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);
        }
    });
}
21
Nic Hubbard

Fonctionne bien pour moi:

<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>
33
Mike Thomsen

Vous pouvez utiliser le mot clé this pour accéder aux données personnalisées, transmises à la fonction $. Ajax ():

    $.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);
    }
21
iPath ツ

c'est comme ça que je le fais

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);
3
mcgrailm

Dans le premier bloc de code, vous n'utilisez jamais le paramètre str. Vouliez-vous dire ce qui suit?

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

Je crois que votre problème est que vous passez testFunct une chaîne, et non un objet fonction, (est-ce même possible?)

1
p3drosola

Bien que je ne sois pas sûr à 100% de ce que vous voulez (probablement mon cerveau est lent aujourd'hui), voici un exemple d'utilisation similaire à ce que vous décrivez:

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);
};
1
Mark Schultheiss