2014-01-16 144 views
1

我应该使用此函数的返回值做一些控制。即使res的值转化为“when-then”过程的错误结果,hasIllegalRoute函数返回,res也是如此。因为jquery异步工作,所以不等待完成when-then操作返回res的值。我怎么解决这个问题?jquery异步问题?

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; 
} 
+1

'返回false;'是它的第一个'。那么()' – Jai

+0

是这样结果的价值来自假和资源需要=假 – ebruszl

+0

尝试改变这一点:'返回false;'这样:'返回RES ;'或删除它,因为我知道'return false;'停止脚本执行。 – Jai

回答

0

我转向功能的回调类型解决了这个问题;

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

} 
0

没有办法,使这项工作从hasIllegalRoute一个return值。您需要执行任何取决于其回调或其执行的其他函数内部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; 
} 

要做到这一点,最好的办法是将callback参数添加到hasIllegalRoute这需要在完成异步处理多数民众赞成执行的功能。

0

取代最后一次设置res,将回调函数传递给hasIllegalRoute并将其与结果一起调用。然后,您将使您的结果异步返回到回调函数,并且不需要返回。

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

对不起格式化我的手机

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现在不返回一个布尔值,但是对于布尔值的承诺。对于您的控件,请在返回的承诺上添加回调。

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