2016-08-25 2 views
0

У меня есть эта функция JavaScript.Ajax Calls and Callbacks в JavaScript

function create_categories(callback) { 
    cart_cats = []; 
    E.Cart.calculateTotal(function(order) { 
    cart_total = order.total; 
    cart_items = order.cart.items; 
    // loop through the items to get their categories. 
    for(var i=0; i<cart_items.length; i++) { 
     get_product_category(cart_items[i].product.id); 
    } 
    }); 

    setTimeout(callback, 3000); 
} 

функция get_product_category делает Ajax вызов, чтобы получить категорию для cart_item, а затем толкает его в cart_cats массив, который является глобально заявил, и мне нужно, чтобы использовать его в моем callback

Теперь я не хочу использовать setTimeout, потому что я никогда не могу быть уверен в максимальном времени, которое может выполнить функция create_categories, после чего я вызываю callback, потому что cart_items может содержать много элементов.

Я хочу вызвать обратный вызов, когда цикл for завершает выполнение.

ответ

0
function create_categories(callback) { 
    cart_cats = []; 
    E.Cart.calculateTotal(function(order) { 
    cart_total = order.total; 
    cart_items = order.cart.items; 
    completed = 0; 
    for(var i=0; i<cart_items.length; i++) { 
     get_product_category(cart_items[i].product.id); 
     completed++; 
    } 
    if(completed == cart_items.length){ 
     callback; 
    } 
    }); 
} 
+0

'callback;' должно быть 'callback();'. –

+0

Хорошо, это работает! .. но вы можете помочь мне понять это. Я понял, что, поскольку 'get_product_category' делает вызов ajax, элемент управления будет двигаться вперед (из цикла for) и выполнить оператор if. Разве это не так? Когда он продвигается вперед, и когда он ждет завершения заявлений? –

+0

@Mubashar: если бы это сработало, подумали бы вы его принять? Здесь это не обязательно, но полезно как для ответчиков, так и для будущих читателей. – halfer