Frage

Ich arbeite mit mehreren aufgeschobenen AJAX -Anrufen und möchte dynamisch darüber sein, wie ich auf ihre Daten zugreife. Anstatt in mehreren Parametern in den Rückruf zu hartcodieren und einzeln einzeln zu verwenden, möchte ich das Argumenteobjekt durchlaufen, um auf die Daten zuzugreifen. Dies funktioniert einwandfrei, außer dass ich nicht aus dem JSON bestimmen kann, welche Daten aus dem AJAX rufen. Ich könnte dies entweder durch die Bestimmung der URL aus dem Versprechensobjekt (irgendwie) lösen oder herausfinden, welche Bestellung die ausgeführten Ajax -Aufrufe und die Annahme, dass die Daten in derselben Reihenfolge sind.

Hier ist mein bisheriger Code (verspottet, um zu veranschaulichen, was ich versuche):

promises = [ 
    $.get("example.php", {}, function(){}),
    $.get("list.php", {}, function(){}),
    $.get("test.php", {}, function(){}),

]

$.when.apply(null, promises).then( function() {
     jsonarray = []
     $.each(arguments, function(index, value){
         // this is what I would like to work but doesn't
         // promises[index].success.url is how I imagine accessing 
         //"list.php" or "test.php"
         if (jsonarray[promises[index].success.url] == null){
              jsonarray[promises[index].success.url] = []
         }
         jsonarray[promises[index].success.url] = value
         doSomethingWith(jsonarray)
     })

Gibt es eine andere Möglichkeit, jedes Argument mit dem Ajax Call zu entsprechen, der es produziert hat? Was ich nicht tun möchte, ist Folgendes:

$.when.apply(null, promises).then( function(examplejson, listjson, testjson) {
         // this is lame
         exampledoSomethingWith(examplejson)
         listdoSomethingWith(listjson)
         testdoSomethingWith(testjson)
})

Vielen Dank! Sara

War es hilfreich?

Lösung

http://jsfiddle.net/6ezsh/2/

$(function() {

    var objs = [{'one':1},{'two':2},{'three':3}];
    var urls = [];

    ajaxCall = function(i) {
        return $.ajax({
            url:'/echo/html/',
            method: 'POST',
            data: {id:i}
        }).done(function () {
            urls.push({obj:i,url:this.url});
        });   
    }

   $.when.apply($,
        objs.map(function(i) {
            return ajaxCall(i);
        })
    ).then(
        console.log(urls)
    );

});

Wie bereits erwähnt, dass das Objekt, das Sie in Ihrem "dann" erhalten, sind die Erfolgshandler für alle Ihre Aufschiebungen. Die einzige wirkliche Möglichkeit, diese Informationen zu kombinieren, wäre der Erfolgshandler Ihrer Ajax -Anrufe. Beispiel oben.

Andere Tipps

Lass es uns versuchen

var urls = [
    "example.php",
    "list.php",
    "test.php"
];
var promises = [  
];

var jsonarray = {};
$.each(urls, function(index, value) {
    promises[index] = $.get(urls[index], {}, function(){});
    promises[index].success(function(data) {
        jsonarray[urls[index]] = data; //is this the value you want in the jsonarray??
    });
});

$.when.apply(null, promises).then( function() {
    doSomethingWith(jsonarray) 
});
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top