2016-07-14 1 views
1

Мне нужно сделать 2 обращения к API, каждый из которых содержит некоторые из общих данных, которые затем должны быть повторены. Вызов 1 получает два JSONP объектов:

[{ 
    "id": 17, 
    "name": "A", 
    "campaign_code": "CAP20481" 
},{ 
    "id": 18, 
    "name": "B", 
    "campaign_code": "CAP20481" 
}] 

вызова 2 использует идентификатор из первого звонка, чтобы получить целое число. Затем мне нужно соответствующее «имя» и целое число. До сих пор у меня есть:

function getStoreCounts() { 
    var campaignID = $("input[title='Campaign ID']").val(); 
    var storeLists = $.ajax({ 
     type: "GET", 
     dataType: "jsonp", 
     url: "/apiIndex?callback=?&campaign_code=" + campaignID.toString(), 
    }), 
    storeCount = storeLists.then(function(data) {  
     $.each(data,function(i,storeList){ 
      $.extend(storeList,{stores:''}); 
      var getCount = $.ajax({ 
       type: "GET", 
       dataType: "jsonp", 
       url: "/apiStoreCount?callback=?&list_id=" + storeList.id.toString(), 
      }); 

      getCount.done(function(count) { 
       storeList.stores = count; 
      }); 

     }); 
     return data; 
    }); 

    storeCount.done(function(data) { 
     console.log(data); 
     $.each(data,function(i,tierCount){ 
      console.log("Tier: "+tierCount.name); 
      console.log("Stores: "+tierCount.stores); 
     }); 
    }); 
} 

На заключительном done возвращения обещание, когда я выйти из массива весь данных, я получаю хранит значения для каждого объекта нетронутыми. Но когда я пытаюсь перебрать каждый объект в массиве, мне не хватает значения магазинов. Добавлен вывод из Chrome.

enter image description here

+1

Ваш вопрос, потому что вы не ждете второй петли AJAX запросов завершить до возвращения 'data'. Вам нужно вернуть эти обещания в виде массива и ждать их всех. Также обратите внимание, что это было бы намного проще (и менее требовательно на вашем сервере), если бы вы вернули всю эту информацию в одном запросе. –

ответ

2

Вы должны ждать, пока все внутренние обещания решить. $.when

storeCount = storeLists.then(function(data) { 
    // array of promises  
    var counting = $.map(data,function(storeList){ 
     $.extend(storeList,{stores:''}); 
     var getCount = $.ajax({ 
      type: "GET", 
      dataType: "jsonp", 
      url: "/apiStoreCount?callback=?&list_id=" + storeList.id.toString(), 
     }); 

     return getCount.then(function(count) { 
      storeList.stores = count; 
     }); 

    }); 
    // wait for all 
    return $.when.apply($, counting).then(function() { 
     return data; //return modified data 
    }) 
}); 

И стороне записки о наименовании convetion. Ваша функция была названа getStoreCounts, но возвращает undefined. Пусть это вернет окончательное обещание.

function gettingStoreCounts() { 
    var campaignID = $("input[title='Campaign ID']").val(); 
    var storeLists = $.ajax({...}), 
    return storeLists.then(...); 
} 

И использовать результат на стороне вызова

gettingStoreCounts().then(/*log, whatever*/) 
+0

Спасибо, Юрий, интересно, что это было больше, чем просто ждать всех обещаний для разрешения - .map() нужно было модифицировать данные. [Это тоже помогло] (http://stackoverflow.com/questions/749084/jquery-map-vs-each). – sansSpoon

Смежные вопросы