javascript - Jquery异步问题?

  显示原文与译文双语对照的内容

我应该用这的函数返回值来做一些控制。 即使 false的值转到"当时"进程的结果,hasIllegalRoute函数返回,res也是 true 。 因为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;
} 

时间: 作者:

我如何解决这个问题?

异步函数不能有 return ( 或者至少没有一个依赖于未来的结果)"。 相反,你将需要返回你已经拥有的承诺:


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

作者:

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

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

抱歉,我的手机设置了格式

不可能用 hasIllegalRoute 中的return 值来处理这项工作。 需要执行任何依赖于它的回调的when/then inside的结果或者它的执行的它的他函数的操作。

换句话说:


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 参数,该参数采用在异步处理完成时执行的函数。

作者:

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


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

}

作者:
...