2011-06-23 60 views
0

我正在对URL进行递归调用,直到它返回成功或已达到最大尝试限制。下面是相关的代码,(精缩,可以这么说):Javascript递归setTimeout不使用完整的最终JSON返回

function doSomething(numRetries) { 
    $.post('someURL', {retry: numRetries}, 
     function (data) { 
      if (data.value == 1) { 
       displayResults(data.message, data.value); 
      } else if (data.value == "retry") { 
       setTimeout(function() { doSomething(data.retries) }, 1000); 
      } else { 
       displayResults(data.message, data.value); 
      } 
     }, 
     "json" 
    ); 
} 

IFF的第一调用sumeURL返回data.value == 1,则执行displaySuccess。同样,如果它返回另一个值(例如0),它将成功显示失败()。

问题在于递归部分。在启动重试之后,会执行再次以递增的重试值调用doSomething(),但之后的任何返回数据都不会被使用。

所以,当内部someURL我的重试超​​时是3,例如,我可以在萤火看到:

post('someURL', 0) returns JSONified (value = "retry", retries = 1) 
post('someURL', 1) returns JSONified (value = "retry", retries = 2) 
post('someURL', 2) returns JSONified (value = 0, error = "Display this error!") 

但警报()内displayFailure指示错误= [未定义],即使值= 0 (不是“重试”)。 Firebug表明正在进行正确的JSON解析。

编辑修改DoSomething的是现实中更准确地反映,尽管改变不应该引入任何不确定性,以及按要求,这里有来自后期的实际通话返回值:

{"success":"retry","retryCount":"1"} 
{"success":"retry","retryCount":"2"} 
{"success":0,"errormsg":"The request is taking longer than expected, but should be completed soon. Please try again in 15 minutes."} 

最后这里是一个缩小显示结果():

function displayResults(text, status) { 
    $('#dispElem').queue(function(next) { //this is so that fades happen around the text update, not before/during it; there may be better ways to do this 
     $('#dispElem').html(text); 
     if (status == 1) { 
      $('#dispElem').addClass("success"); 
     } else { 
      // hide and show random elements 
     } 
     next(); 
    }).fadeIn().queue(function(next) { //scroll to bottom; next(); }); 
} 
+3

没有什么突然出现在我身上,显然是错误的。也许你可以发布你的displayFailure()函数呢? – nnnnnn

+1

您尝试访问的属性名称存在某些问题,或者'displayFailure()'函数中存在一些问题。无论哪种方式,问题中的代码都无法知道问题。请发布'displayFailure()'函数,并收到原始的JSON数据。 – user113716

+0

我不相信错误在于这段代码。大概在你的displayFailiure函数中。 – Slappy

回答

0

arrrgh。

所有最糟糕的情况 - 大写/小写错误我只是不得不忽略,直到被迫重新输入以缩小。

谢谢,所有的评论,让我重新组合,用更细的牙齿,可以这么说。