2017-09-09 3 views
0

객체 배열에서 롤백하는 각 문을 JQuery에두고 해당 객체의 값이 비어 있는지 확인하여 사용자가 bootbox를 사용하여 프롬프트 창에 해당 값을 입력하도록 한 다음 완료 될 때까지 루프를 계속합니다 .

각 진술 완료 후 아약스 함수는 각각의 세련된 개체를 개최해야합니다.

문제는 ajax 함수가 각 명령문 실행 시간 동안 비동기 적으로 발생한다는 것입니다. $ .each 문이 동기하고 완료 후에는 실행해야합니다 후 아무것도 있어야하기 때문에

$.each(objs,function(k,v){ 

if (v == empty) 
    //prompt bootbox modal to enter the value and (at this time ajax is fired 
    v=bootboxpromptvalue ) 

}) 
$.ajax({ 
.. 
... 
.... 
data:objs 
}) 

질문은 각 런타임 동안 왜 아약스 화재입니까?

+4

'$입니다. 각각은 동기식이지만'$ .ajax'는 그렇지 않습니다. 그게 그래야만합니다. – trincot

+0

아약스를 만드는 방법은 바로 뒤에 있습니다. –

+0

코드를 수정할 수 있습니다 : 느슨한')'이 있고'each '는 현재 쓸데없는 것 같습니다 :'v'를 재정 의하여 배열을 변경하지 않을 것입니다. 'bootboxpromptvalue'는 무엇입니까? 차단하고 있습니까? 아마도 그렇지 않을 것입니다. 즉, 해당 코드가 모두 실행 된 후에 만 ​​사용자에게 메시지가 표시됩니다. – trincot

답변

0

부트 셸 프롬프트는 비동기식이므로 사용자에게 묻기 전에 $.each 루프가 계속 진행되고 $.ajax 호출이 실행됩니다. 당신이 대답을 사용자에게 메시지를 원하는대로이 문제를 해결하려면

, 당신은 즉시 실행을 종료해야하며, 당신이 대답을 경우에만 다시 모든 것을 시도해야합니다 :

function process() { 
    var isEmpty = false; 
    $.each(objs, function(k,v){ 
     isEmpty = v == empty; 
     if (isEmpty) { 
      bootbox.prompt("Enter value for " + k, function(answer) { 
       objs[k] = answer; 
       // Now we have an answer, try again. 
       process(); 
      }); 
      return false; // break out of `each` 
     } 
    } 
    // Exit if we asked for user input. There will be 
    // a new call to this function later. 
    if (isEmpty) return; 
    // We got everything now, so execute the request 
    $.ajax({ 
     //... 
     data: objs 
    }); 
} 
관련 문제