【问题标题】:Jquery asynchronous issue?Jquery异步问题?
【发布时间】:2014-01-16 06:50:21
【问题描述】:

我应该使用这个函数的返回值来做一些控制。即使 res 的值变为 false 的“when-then”过程的结果,hasIllegalRoute 函数返回,res 为 true。因为 jquery 是异步工作的,所以不要等待完成 when-then 操作以返回 res 的值。我该如何解决这个问题?

function hasIllegalRoute()
{
  var res = true;  
  $.when(returnUncompletedRoute()).then(function(routeList)
  { 
    if(routeList.length>0)
    {
      var uncompletedRoute = 0;
      var today = new Date();
      routeList.forEach(function(e)
      {
        var routeDate = new Date(e.ROUTE_DATE);  
        if(calcDay(routeDate) != calcDay(today))
        {
          uncompletedRoute++;
        } 
      });
      if(uncompletedRoute>0)
      {
        $("#errorPageRouteMenu").append("<p>Sonlandırılmamış kayıtlarınız var, bu kayıtları sonlandırmadan yeni bir rotaya başlayamazsınız</p>");  
        return false;
      }
    }    
    }).then(function(result)
    {
      res = result;
    });  
  return res;
} 

【问题讨论】:

  • return false; 第一个.then()是否需要
  • 是的,所以结果的值为 false 并且 res=false
  • 尝试将这个:return false; 更改为这个:return res; 或删除它,因为我知道return false; 会停止脚本执行。

标签: javascript jquery asynchronous return-value promise


【解决方案1】:

我该如何解决这个问题?

一个异步函数cannot have a return value(或者至少不依赖于未来的结果)。相反,您需要返回您已经拥有的承诺:

function hasIllegalRoute() {
  return $.when(returnUncompletedRoute()).then(function(routeList) {
//^^^^^^
    if(routeList.length>0) {
      var uncompletedRoute = 0;
      var today = new Date();
      routeList.forEach(function(e) {
        var routeDate = new Date(e.ROUTE_DATE);  
        if(calcDay(routeDate) != calcDay(today))
          uncompletedRoute++;
      });
      if(uncompletedRoute>0)
        $("#errorPageRouteMenu").append("<p>Sonlandırılmamış kayıtlarınız var, bu kayıtları sonlandırmadan yeni bir rotaya başlayamazsınız</p>");  
        return false;
    }
    return true;
//  ^^^^^^^^^^^^
  }
}

hasIllegalRoute 现在不返回布尔值,而是返回该布尔值的 Promise。对于您的控件,在返回的 Promise 上添加一个回调。

顺便说一句,您可以使用.some()(它会立即返回预期的布尔值)而不是那种复杂的forEach

【讨论】:

    【解决方案2】:

    而不是最后一个然后设置 res,将回调函数传递给 hasIllegalRoute 并使用结果调用它。然后你的结果会异步返回给回调函数,不需要返回。

    这可能涉及更改您使用 hasIllegalRoute 的结构,但这是常见的异步结构。

    抱歉在我的手机上格式化

    【讨论】:

      【解决方案3】:

      无法使用来自hasIllegalRoutereturn 值来完成这项工作。您需要执行依赖于其回调内部的when/then 的结果或它执行的某些其他函数的任何操作。

      换句话说:

      if (uncompletedRoute > 0) {
            $("#errorPageRouteMenu").append("<p>Sonlandırılmamış kayıtlarınız var</p>");  
            // do not return here; instead, perform whatever action should happen 
            // when this would have done so
            // return false;
      }
      

      最好的方法是向hasIllegalRoute 添加一个callback 参数,该参数采用异步处理完成时执行的函数。

      【讨论】:

        【解决方案4】:

        我通过转向函数的回调类型解决了这个问题;

        function hasIllegalRoute(callback)
            {  
              var errorMsg;
              $.when(returnUncompletedRoute()).then(function(routeList)
              { 
                //filter query döndürdüğü için toList fonksiyonu ile promise'e çevirdik
                //query boş iken toList 0 uzunluğunda liste döndürdü onu kontrol ettik
                if(routeList.length > 0)
                {
                  var uncompletedRoute = 0;
                  var today = new Date();
                  routeList.forEach(function(e)
                  {
                    var routeDate = new Date(e.ROUTE_DATE);  
                    if(calcDay(routeDate) != calcDay(today))
                    {
                      uncompletedRoute++;
                    } 
                  });
        
                  if(uncompletedRoute > 0)
                  {
                    errorMsg = ("<p>Sonlandırılmamış kayıtlarınız var, bu kayıtları sonlandırmadan yeni bir rotaya başlayamazsınız</p>");
                  }
        
                  return errorMsg;
                }    
              }).then(function(result)
              {
                if(typeof callback === "function")
                {
                  callback(result);
                }
              });
            }  
        
        
            //Rotanın tarih kontrolü ve tamamlanmamış veya gönderilmemiş rota kontrolleri. Kontrol sonucunda, varsa hata mesajı döndürülür.
            function checkRouteDailyRecord(callback)
            { 
              var errorMsg;
        
              $.when(returnRouteDailyRecord()).then(function(e)
              {
                var transferStatus = e.TRANSFER_STATUS;
                var routeItem =  returnRouteDailyList(e.ROUTE_DAILY_ID) ;
                //Sorgudan kayıt dönmüyorsa hiç gün başlamamış demektir.Rotaya başlanabilir. 
                // return sonucunda result değeri undefined olur, hata mesajı gösterilmez ve checkRoute değeri false kalır 
                if(routeItem.length == 0)
                  errorMsg = undefined ; 
        
                //Gönderilmiş ve gün sonu yapılmış rotaların sayısını hesaplama    
                if(transferStatus == 1 && routeItem.COMPLETED == 1)
                  errorMsg = ("<p>Tüm verileriniz gönderilmiş olarak işaretlenmiş. Veri almadan rotaya başlayamazsınız</p>");
        
                if(transferStatus == 0 && routeItem.COMPLETED == 0)
                {
                  today = new Date();
                  var routeDate = new Date(routeItem.ROUTE_DATE);
                  //Rota listesinden dönen rotaların tarihlerinin, bugün ile tek tek karşılaştırılması.
                  //Eğer bugun harici bir rotanın rota sonu yapılmamışsa yeni rotaya başlanamaz.
                  if(calcDay(today) != calcDay(routeDate))
                  {
                    errorMsg =('<p>' + routeDate + 'tarihine ait tamamlanmamış rotanız bulunmaktadır. Lütfen sistem yöneticinize danışınız.</p>');
                  }
                }  
                  // if(routeItem.COMPLETED == 1),
                  // {
                  //  read only 
                  // }   
                return errorMsg;
              }).then(function(result)
              {
                if(typeof callback === "function")
                {
                  callback(result);
                }
              }).fail(function()
              {
                if(typeof callback === "function")
                {
                  callback(errorMsg);
                }
              });
        
        }
        

        【讨论】:

          猜你喜欢
          • 2013-05-07
          • 1970-01-01
          • 2010-11-27
          • 2015-08-21
          • 1970-01-01
          • 1970-01-01
          • 2018-12-09
          • 2017-12-31
          • 1970-01-01
          相关资源
          最近更新 更多