2014-01-16 199 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