2017-10-10 1 views
0

배열을 처리해야하는 함수가 있습니다.이 함수의 일부로 루프를 반복하고 유효한지를 결정하는 값을 사용하여 ajax 호출을 수행해야합니다. 오류가 발견되면 모든 데이터를 처리 한 후 오류 메시지 문자열을 반환합니다. 함수가 반환되기 전에 모든 루프가 완료 될 것이라는 점을 염두에 두면서 어떻게 AJAX 호출을 완료 할 수 있을까요?forEach 내에서 forEach 함수 내에서 Ajax 호출을 기다리는 중

모든 종류의 지연/약속 관련 작업을 시도했지만 올바르게 처리 할 수 ​​없습니다. ( forEach로 인해 "반환 비동기 데이터를 얻는 방법" 또는 원리가 같더라도 implimentation에 어려움을 겪고 있습니다.

아래의 트림 된 코드는 차이를 만드는 경우 forEach 내에서 // 다른 것들을 수행하십시오. 주의자는 handleFileSelect()을 호출합니다. basicValidation() 호출;

function basicValidation(data) { 
    // Store errors to be returned. 
    var failed = ''; 
    // Loop over each row and validate. 
    data.forEach(function(row, index) { 

     // Do other stuff. 

     if (a) { 
      // Do stuff. 
     } else if (b) { 
      // Do ajax bit that only happen sometimes. 
      $.ajax({ 
       url: 'https://api.postcodes.io/postcodes/' + row[5], 
       success: function (data) { 
        if (200 !== data.status) { 
         failed += 'Row ' + index + ':: invalid Address - lookup failed.\n'; 
        } 
        // Do other checks. 
       }, 
       error: function (request, status, error) { 
        console.log( 'Postcode lookup request failed:: ' + request.responseText + '\n' + status + '\n' + error); 
       } 
      }); 
     } 

     // Do other stuff. 
    } 

    return failed; 
} 


function handleFileSelect(results) { 
    // Do the basic front-end validation. 
    var validation = basicValidation(results.data); 
    if (validation.length) { 
     alert('Failed.\n\n' + validation + '\nPlease correct your data, refresh the page, and try again.'); 
     return false; 
    } 
} 
+0

모습으로'$ .when' –

+0

은 큰 문제는 모두 당신이 보여준 기능은 동기 결과 ('failed'와 'FALSE')을 반환 할 것입니다 도입 된 비동기 코드 - 그래서'handleFileSelect' 호출 방법도 변경해야합니다 –

+0

Thanks @ JaromandaX -하지만 좀 더 손을 들고 가야합니다. $ .Deferred() 및 $ .when을 사용하여 기본 비동기 함수를 수행 할 수 있지만이 특정 컨텍스트에서 작동시키지 못합니다. – phil

답변

0

당신이설정을 시도 되세요 0 AJAX에? docs에 따르면

가 :

비동기 (기본값 : true)를 입력 : 부울 기본적으로 모든 요청 (즉이 기본적으로 true로 설정) 비동기 전송됩니다. 동기화 요청이 인 경우이 옵션을 false로 설정하십시오.

계속하기 전에 응답을 기다립니다. 당신이했습니다 일단 이런 일이 없습니다 -

// Do ajax bit. 
     $.ajax({ 
      url: 'https://api.postcodes.io/postcodes/' + row[5], 
      async: false, 
      success: function (data) { 
       if (200 !== data.status) { 
        failed += 'Row ' + index + ':: invalid Address - lookup failed.\n'; 
       } 
       // Do other checks. 
      }, 
      error: function (request, status, error) { 
       console.log( 'Postcode lookup request failed:: ' + request.responseText + '\n' + status + '\n' + error); 
      } 
     }); 
+1

동기 요청은 더 이상 사용되지 않습니다. –

+1

'async : false'를 사용하는 것은 매우 나쁜 습관입니다. – PredatorIWD

+0

답변을 주셔서 감사합니다 @ jeramiah - harland -하지만 그 무서운 비난 경고를 제공합니다! – phil

관련 문제