Javascript回调()用于两个函数

时间:2015-05-18 10:18:14

标签: javascript callback

关于JavaScript的回调,我有两个问题。

首先: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()运行异步。当两者完成后,我想做一些&#34;刷新&#34;。

目前我正在使用:

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();
      })
   });
}

是否可以让postDatadeleteData运行同步,两者完成后运行refresh

-----编辑-----

为了确保在循环完成后发送回调,我使用如下代码:

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();
}

但它看起来很难看......我希望有一个更清洁的解决方案......

回复Ivan,Angular也回复了http请求,我不需要使用$ ajax而且我不想回复每个http请求

2 个答案:

答案 0 :(得分:2)

是的,使用$ q promise库,您可以实现这一目标。 如果您使用角度,$ 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 :(得分:-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();
      };
   }
}