2015-05-18 2 views
1

У меня есть два вопроса относительно обратного вызова JavaScript.Javascript callback() для двух функций

Во-первых: Выполняется ли цикл for асинхронно? То есть, в функции:

function postData(items, callback) 
{ 
    for(var i=0 ; i < items.length ; i++) 
    { 
     //angularjs Post request 
     $http.post("http://www....", item[i]); 
    } 

    callback(); 
} 

Будет callback() подождать до завершения цикла?

Во-вторых: Как я могу ждать обратного вызова двух функций?

У меня есть другая функция deleteData(items, callback), что я хочу запустить асинхронный с postData(). Когда все будет сделано, я хочу сделать «обновление».

Сейчас я использую:

function postData(items, callback) 
{ 
    for(var i=0 ; i < items.length ; i++) 
    { 
     //angularjs Post request 
     $http.post("http://www....", item[i]); 
    } 

    callback(); 
} 

function deleteData(items, callback) 
{ 
    for(var i=0 ; i < items.length ; i++) 
    { 
     //angularjs delete request 
     $http.delete("http://www....", item[i].id); 
    } 

    callback(); 
} 

function refresh() 
{ 
    $http.get("www....").success.... 
} 

function doit(post, delete) 
{ 
    postData(post, function(){ 
     deleteData(delete, function(){ 
      refresh(); 
     }) 
    }); 
} 

Можно ли сделать postData и deleteData запустить assync и когда оба сделали запустить refresh?

----- EDIT -----

Чтобы убедиться в том, что обратный вызов отправить после цикла будет сделано, я использую такой код:

function postData(items, callback) 
{ 
    if(items.length == 0) 
    callback(); 
    for(var i=0 ; i < items.length ; i++) 
    { 
     //angularjs Post request 
     $http.post("http://www....", item[i]); 

     if(i == items.length-1) 
     callback(); 
    } 

    callback(); 
} 

Но это выглядит уродливый ... Я надеялся на более чистое решение ...

Ответ на Иван, Угловой имеет также обратный вызов для http-запросов, мне не нужно использовать $ ajax, и я не хочу обратного вызова для каждого http-запрос

ответ

2

Да, с помощью $ Q библиотеки обещание, вы можете достичь этого. Если вы используете угловое значение, $ q уже находится в вашем проекте, просто включите его в службу/контроллер, который вы используете.

$q.all делает именно то, что вы ищете.

Пример того, как это будет выглядеть:

var promises = []; 

// loop x times 
for(var i = 0; i < items.length; i ++){ 
    var promise = $http.post("http://www....", item[i]); 
    promises.push(promise); 
} 

// Refresh will be called when all posts are completed. 
$q.all(promises).then(refresh); 
+1

Это именно то, что мне нужно ... И спасибо за обновленный ответ с примером – NunoRibeiro

-1

Во-первых: нет, он не будет ждать.

Второе: Использование $.ajax:

function postData(items, callback) 
{ 
    for(var i=0 ; i < items.length ; i++) 
    { 
     $.ajax({ 
     url: "http://www....", 
     ........... 
     }).done(function() { 
     callback(); 
     }); 
    } 
} 

Или альтернативно ваниль JS:

function postData(items, callback) 
{ 
    for(var i=0 ; i < items.length ; i++) 
    { 
     var r = new XMLHttpRequest(); 
     r.open("POST", "http://www....", true); 
     r.onreadystatechange = function() { 
     if (r.readyState != 4 || r.status != 200) return; 
     callback(); 
     }; 
    } 
} 
+1

ОП не использует JQuery. – Tomalak

+0

@ Томалак, извините, но что такое OP? – Ivan

+0

«Оригинальный плакат» - человек, который начал тему. http://www.urbandictionary.com/define.php?term=op&defid=2172424 – Tomalak