【问题标题】:Javascript callback() for two functions两个函数的 Javascript 回调()
【发布时间】:2015-05-18 10:18:14
【问题描述】:

我有两个关于 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() 异步运行。当这两个完成后,我想做一些“刷新”。

目前我正在使用:

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 请求回调

【问题讨论】:

    标签: javascript callback


    【解决方案1】:

    是的,使用 $q 承诺库,您可以实现这一点。 如果您正在使用 Angular,则 $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); 
    

    【讨论】:

    • 这正是我所需要的......感谢您提供示例的更新答案
    【解决方案2】:

    首先:不,它不会等待。

    第二种:使用$.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();
          };
       }
    }
    

    【讨论】:

    • OP 不使用 jQuery。
    • @Tomalak,抱歉,OP 是什么?
    • "Original Poster" - 发起主题的人。 urbandictionary.com/define.php?term=op&defid=2172424
    • @Tomalak,感谢您的澄清。我已根据您的评论更改了答案
    • 根据您的回答,它会为每个发布请求发送回调......这不是我想要的。当所有发布请求都完成后,我想要一个回调......
    猜你喜欢
    • 1970-01-01
    • 2021-08-01
    • 1970-01-01
    • 2013-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    相关资源
    最近更新 更多