2015-07-27 5 views
0

Я звоню в службу, чтобы получить массив идентификаторов, а затем прокручивать каждый из них и вызывать другую службу для их соответствующих данных. Консоль показывает, что служба getBookings в для цикла не обрабатывается последовательно.Как получить цикл for, чтобы дождаться завершения каждого обратного вызова

service.getStoreIDs(function (data1) { 
     var scheduledBookings = []; 

     console.log('StoreIDs = ' + data1.length); // There are only 3 in my test data 

     for (var storeID in data1) { 
      var s = data1[storeID]; 
      var storeno = s['Storeno']; 

      service.getBookings(storeno, "", function (data2) { 

       if (data2.length == 0) { 
        scheduledBookings.push({ Storeno: storeno, Id: 0 }); 
       } 
       else { 
        console.log('[BuildMFB] Storeno ' + storeno + ' = ' + data2.length + ' bookings') 
        for (var book in data2) { 
         var b = data2[book]; 

         prevStoreno = storeno; 

         scheduledBookings.push({ 
          Storeno: (prevStoreno == storeno ? "" : storeno), 
          Id: b.Id, 
          BookedBy: b.BookedBy, 
          Description: b.Description, 
          StartDate: b.StartDate, 
          EndDate: b.EndDate, 
         }); 
        } 
        prevStoreno = storeno; 
       } 
      }); 
     } 
     $scope.currentBookings = scheduledBookings; 
    }); 

Все заказы присваиваемые в магазин 144, как вы можете видеть из консольных сообщений, ниже которой не право, поскольку он имеет только 1 номер.

Я могу только думать, что это проблема обработки async (?).

Console сообщение (BuildMFB является текущая функция):

[BuildMFB] StoreIDs = 3 
[BuildMFB] storeID: 101 
[BuildMFB] storeID: 131 
[BuildMFB] storeID: 144 
[getBookings] Storeno 101 has 5 bookings 
[BuildMFB] Storeno 144 = 5 bookings 
[BuildMFB] Added 253 for 144 
[BuildMFB] Added 151 for 144 
[BuildMFB] Added 215 for 144 
[BuildMFB] Added 217 for 144 
[BuildMFB] Added 208 for 144 
[BuildMBF] currentBookings = 5 
[getBookings] Storeno 131 has 2 bookings 
[BuildMFB] Storeno 144 = 2 bookings 
[BuildMFB] Added 227 for 144 
[BuildMFB] Added 226 for 144 
[BuildMBF] currentBookings = 7 
[getBookings] Storeno 144 has 1 bookings 
[BuildMFB] Storeno 144 = 1 bookings 
[BuildMFB] Added 238 for 144 
[BuildMBF] currentBookings = 8 

Обновлено методом getBookings:

var getBookings = function (storeno, userid, callback) { 
    var filterString = ""; 

    if (storeno != "0" && userid != "") { 
     filterString = "?$filter=(Title eq '" + storeno + "') and (Status eq 'Booked') and (BookedBy eq '" + userid + "')&$orderby=Title asc"; 
    } 
    else if (storeno != "0") { 
     filterString = "?$filter=(Title eq '" + storeno + "') and (Status eq 'Booked')&$orderby=Title asc"; 
    } 
    else if (userid != "") { 
     filterString = "?$filter=(Status eq 'Booked') and (BookedBy eq '" + userid + "')&$orderby=Title asc"; 
    } 
    else { 
     filterString = "?$filter=(Status eq 'Booked')&$orderby=Title asc"; 
    } 

    $http({ 
     method: 'GET', 
     url: "/_api/web/lists/GetByTitle('Bookings')/Items" + filterString, 
     headers: { 
      'Accept': 'application/json; odata=verbose' 
     }, 
    }).success(function (d) { 
     var bookings = []; 

     $(d.d.results).each(function (i, e) { 
      bookings.push({ 
       Id: e['Id'], 
       Storeno: e['Title'], 
       BookedBy: e['BookedBy'], 
       Description: e['Description'], 
       StartDate: e['StartDate'], 
       EndDate: e['EndDate'], 
      }); 
     }); 

     callback(bookings); 

    }).error(function (er) { 
     alert("[getBookings] http error : " + er); 
    }); 
}; 
+0

Можем ли мы увидеть метод 'getBookings'? –

+0

@ Matt% 20Herbstritt - добавлено выше –

ответ

1

В то время как вы определили локальные переменные в вашем for цикле их определение на самом деле будет поднят к началу функции эти переменные затем обновляются на каждой итерации до завершения любой из ваших асинхронных задач. Простое решение - использовать служебную функцию foreach, такую ​​как $.each jQuery или _.each нижнего подчеркивания, которая вызывает функцию для каждой итерации.

EDIT: Извините, обновлено для значений ключей, а не массива.

... 
$.each(data1, function (storeID, s) { 
    var storeno = s['Storeno']; 
    ... 
}); 
... 
+0

Является ли (I, storeID) и (ключ, значение)? Я получаю «Не удалось получить свойство Storeno неопределенной или нулевой ссылки?» –