2015-01-29 3 views
2

Мне нужно выполнить функцию обратного вызова после завершения всех асинхронных функций.
Для этого я создал массив, содержащий асинхронные функции:

var funcs = []; 
var requests = []; 

В котором я подтолкнул некоторые функции AJAX.

Это мое решение, которое не работает:

for(i = 0; i < functions.length; i++){ 
    var f = functions[i](); //calling each ajax functions 
    requests.push(f); 
}  
$.when.apply(null, requests).done(function(){ 
    console.log("Hello"); 
}); 

Теперь функции выполняются асинхронно, но функции обратного вызова вызывается перед завершает выполнение функции.

Одним из примера функции AJAX Я оттолкнул:

functions.push(function() { 
    return $.ajax({ 
    url: "some url", 
    success: function(){ 
    console.log("Finished execution"); 
    } 
}); 
+4

Вы должны ретранслировать обещание возвращенное по '$ .ajax()' вашему абоненту. Другими словами, 'return $ .ajax ({/ * ... * /});'. Также обратите внимание, что код в вашем вопросе содержит синтаксическую ошибку. –

+0

1. У кода есть ошибки. 2. Попробуйте добавить 'console.log (« Function called »);' перед '$ .ajax' в функции. –

+1

Редактирование устраняет тот факт, что вы не вызываете функции, но вам все равно нужно сделать, как предлагает @ FrédéricHamidi и вернуть результат '$ .ajax' в вашу примерную функцию. –

ответ

1

Вашей анонимная функция не имеет return поэтому его эффективное значение возврата не undefined.

Итак, сначала нужно исправить анонимную функцию, чтобы включать в себя return:

functions.push(function() { 
    return $.ajax(...); 
}); 

Вы можете также сделать более чистую реализацию Вашего цикла вызова:

var requests = functions.map(function(f) { 
    return f(); 
}); 

$.when.apply($, requests).done(callb); 
+0

Я использовал return, все та же проблема. Теперь выполняются функции ajax, но '.done' не является. –

+0

Да, после добавления' return' и немного изменилось в коде, его работа сейчас. Спасибо всем за помощь :) –

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