Пара данных из нескольких вызовов AJAX с его абонентом

StackOverflow https://stackoverflow.com/questions/8837260

  •  27-10-2019
  •  | 
  •  

Вопрос

Я работаю с несколькими отложенными вызовами Ajax, и я хотел бы быть динамичным в отношении того, как я доступ к их данным. Вместо того, чтобы жестко кодировать в нескольких параметрах в обратный вызов .Then и использование каждого индивидуального, я хотел бы пройти через объект аргументов для доступа к данным. Это работает нормально, за исключением того, что я не могу определить из JSON, какие данные, из которых вызывает Ajax. Я мог бы решить это либо путем определения URL -адреса из объекта Propect (каким -то образом), либо выяснить, какой порядок вызовет AJAX, и предполагая, что данные находятся в том же порядке.

Вот мой код до сих пор (издевался за то, чтобы проиллюстрировать то, что я пытаюсь сделать):

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

Есть ли другой способ сопоставить каждый аргумент с вызовом Ajax, который его произвел? Я не хочу делать:

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

Спасибо! Сара

Это было полезно?

Решение

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

});

Как уже упоминалось, объект, который вы получаете в своем «тогда», являются обработчиками успеха для всех ваших отложенных. Таким образом, единственным реальным способом соединить эту информацию было бы в обработке успеха ваших звонков Ajax. Пример выше.

Другие советы

давай попробуем

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) 
});
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top