2013-05-17 3 views
0

У меня такой цикл, и он должен вернуться и выйти из цикла, если запрос ajax был успешным, также он должен повторять только 10 раз, но он просто повторяет цикл 10 раз и останавливается тогда когда запрос был успешным.Цикл повтора Coffeescript не работает

retryCount = 0 

while (retryCount < 10) 
    $.ajax 
    type: "GET" 
    url: "http://" + proxyURL + "?" 
    dataType: "jsonp" 
    data: 
     url: 
     url + "?" + method + "&" + $.param 
      parameters: JSON.stringify parameters 
    success: (response) -> 
     data = response 

     console.log "----------" 
     console.log "METHOD: " + method 
     console.log parameters 
     console.log data 
     console.log "----------" 

     if data.contents.fault 
     if data.contents.fault.code is 256 
      console.log "fetching new token (" + retryCount + ")" 
      fetchNewToken -> 
      return callback(data.contents.result) 
     else 
      console.log "ERROR: " + $.trim(data.contents.fault.message) 

     if data.contents.result 
     if data.contents.result instanceof Array 
      if data.contents.result.length > 0 
      return callback(data.contents.result) 
     else 
      return callback(data.contents.result) 
     else 
     console.log "retrying " + method + " (" + retryCount + ")" 

    retryCount++ 
+0

Это асинхронный **, поэтому вы не можете использовать цикл while. Обратите внимание, что 'success' - это функция обратного вызова *, которая легко теряется в coffescript – Bergi

+0

То же самое происходит со мной при установке async: false в запросе ajax. Что было бы альтернативным путем, чтобы решить эту проблему? – Marius

ответ

1

Я похож, что Вы не получили концепцию асинхронного программирования.

Это то, что происходит:

retryCount = 0 
# TIMESTAMP 0 
while (retryCount < 10) 
    # TIMESTAMP 1, 3, 5, ... 
    $.ajax 
    url: "http://" + proxyURL + "?" 
    dataType: "jsonp" 
    success: (response) -> 
     #TIMESTAMP very later, long after your loop is through 

    # TIMESTAMP 2, 4, 6, ... 
    retryCount++ 

Он должен каким-то образом связаны выглядеть следующим образом (только пример, вроде псевдокод):

retryCount = 0 
loadData = (retryCount, callBack, errorCallBack) -> 
    $.ajax 
    url: "asdasdasd" 
    success:() -> 
     callBack someDataYouRecieved 
    error:() -> 
     retryCount++ 
     if retryCount is 10 
     errorCallBack "got 10 errors" 
     else 
     loadData retryCount, callBack 


loadData retryCount, successHandler, errorHandler 
+0

wow thanks, works! – Marius

0

Если я правильно понимаю, это конструкция, как это должно сделайте трюк (оставшиеся части, относящиеся к домену):

MAX_RETRIES = 10 

issueRequestWithRetries = (request, retries=0) -> 
    request.success = (response) -> 
    # do something, then find out that you need to retry 
    if retries < MAX_RETRIES 
     issueRequestWithRetries(request, retries+1) 
    else 
     # handle the error 
    $.ajax request 

# sample usage 
issueRequestWithRetries 
    type: "GET" 
    url: "http://" + proxyURL + "?" 
    dataType: "jsonp" 
    data: {} # real data