2015-02-20 2 views
0

Как и в this article, у меня есть несколько запросов ajax для выполнения, за которыми следует 1 действие.
Однако разница в том, что весь моем Аяксе запрос отличается только одним параметром дополнительным, как это:Несколько зацикленных запросов ajax с одним обратным вызовом

 $.when(
      // ajax requests 
      // 1 
      $.ajax({ 
       url:"https://www.aaaaaaa.com?param="+0, 
       crossDomain: true, 
       dataType: "jsonp", 
       success: function (response) { 
        data = data.concat(response); 
       } 
      }), 
      // 2 
      $.ajax({ 
       url:"https://www.aaaaaaa.com?param="+2500, 
       crossDomain: true, 
       dataType: "jsonp", 
       success: function (response) { 
        data = data.concat(response); 
       } 
      }), 
      // 3 
      $.ajax({ 
       url:"https://www.aaaaaaa.com?param="+5000, 
       crossDomain: true, 
       dataType: "jsonp", 
       success: function (response) { 
        data = data.concat(response); 
       } 
      }) 
      // etc. ~10 times 

     ).then(function() { 
      // action 
      console.log(data); 
     }); 

Как питон я не люблю повторяться 10 раз.
Я попытался сделать цикл for, но, похоже, писать петли в $ .when() не представляется возможным.

Любые идеи, как достичь этого?
Я искал везде без результатов.

Большое спасибо,

ответ

2

Что, вероятно, должно работать, чтобы определить функцию перед вашими $ .when что-то вроде этого:

function createRequest(port) { 
    return $.ajax({ 
     url:"https://www.aaaaaaa.com?param="+port, 
     crossDomain: true, 
     dataType: "jsonp", 
     success: function (response) { 
      data = data.concat(response); 
     } 
    }) 
} 

и затем использовать это в своих $ .when

$.when(createRequest(0), createRequest(2500), createRequest(5000)); 

И если вы хотите создать вызов этой функции динамически с большим количеством параметров, которые вы можете создать массив из этих запросов для цикла, а затем вызвать $ .when.apply (это, массив)

$.when.apply(this, your_request_array) 

См: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply

Надеется, что это помогает

0

Вы можете использовать Q реализации Kriskowal в: https://github.com/kriskowal/q

есть метод Q.allSettled(arrayOfPromises), что соответствует вашим потребностям.

например:

Q.allSettled(promises) 
.then(function (results) { 
    results.forEach(function (result) { 
     if (result.state === "fulfilled") { 
      var value = result.value; 
     } else { 
      var reason = result.reason; 
     } 
    }); 
}); 

Угловые основывает его $q директивы по этим

0

Просто поместите свои обещания в массиве:

var promises = [0, 2500, 5000].map(function(n) { 
    return $.ajax(...); // appending `n` to the URL as required 
}); 

, а затем вызвать $.when.apply:

$.when.apply($, promises).then(...) 

Параметры, передаваемые в .then обратного вызова будет представлять собой отдельные массивы, каждый из которых содержит три параметра, который принимает один $.ajax обратного вызова.

BTW, ваш текущий код будет конкатцировать массивы в любом порядке, в течение которого вызовы будут завершены, а не обязательно в том порядке, в котором они были запущены.

Если порядка вопросов конкатенации, вы должны использовать эти .then параметры функции, а не существующие success обработчиков для создания data переменного:

then(function() { 
    var data = []; 
    [].forEach.apply(arguments, function(response) { 
     data = data.concat(response[0]); 
    }); 
}); 
Смежные вопросы