2014-12-12 2 views
3

jQuery의 AJAX 지연 기능을 사용하여 구문 분석 및 사용할 수있는 JSON 문자열을 반환하려고하는데 모서리에 자신을 코딩하고있을 수 있습니다. 논리를 망쳤다. AJAX 호출의 결과가 .done() 콜백 에 반환 될 것으로 예상되었으며 이들은입니다. 나는 일단 함수의 나머지 부분에서 사용하기 위해 결과를 반환 할 수 있다고 생각했습니다. 나는 정말 명백하고 단순한 것을 놓치고 있다는 것을 압니다. 나는 그것이 무엇인지에 대해 손가락질 할 수 없습니다..done()을 잘못 사용하고 있습니다. 예상대로 값을 반환하지 않습니다.

다음은 테스트 모드에서 stil 함수의 초기 코딩입니다. JSON은 .done() 함수에서 올바르게 반환되지만 함수 외부에서 사용할 수는 없습니다.

checkUserRoles = function(){ 
    var userRole, foo, roles, i$, len$, i; 
    userRole = roleChecker(); 
    foo = userRole.done(function(data){ 
     var bar; 
     bar = foo.responseText; // correctly returns the JSON data 
     console.log(bar); 
     return bar; // is undefined, this is the problem 
    }); 
    if (userRole !== false) { 
     userRole = jsonDecode(userRole); 
    } else { 
     userRole = ""; 
    } 
    roles = userRole.split(','); 
    $("if-user-role").hide(); 
    for (i$ = 0, len$ = roles.length; i$ < len$; ++i$) { 
     i = roles[i$]; 
     $("if-user-role[data-role~=" + i + "]").show(); 
    } 
    return true; 
}; 
this.roleChecker = function(){ 
    var retVal, allCookies, i$, len$, thecookie, hashedCookie, theHash, userHash, post; 
    retVal = ""; 
    allCookies = document.cookie.split(';'); 
    for (i$ = 0, len$ = allCookies.length; i$ < len$; ++i$) { 
     thecookie = allCookies[i$]; 
     if (thecookie.indexOf('userHash') >= 0) { 
      hashedCookie = thecookie; 
      theHash = hashedCookie.split('='); 
      userHash = theHash[1]; 
     } 
    } 
    post = $.ajax({ 
     url: '/services/check_hash.php', 
     data: { 
      hash: userHash 
     }, 
     type: "POST" 
    }); 
    return post; 
}; 

여기서 볼 수있는 코드는 광범위하게 사용하는 LiveScript 컴파일 결과입니다. 저는 LiveScript가 최종 결과에 영향을 미치지 않는다고 생각합니다. 적절한 JavaScript/jQuery 결과물을 얻으려면 많은 노력을해야했습니다.

참고 : userRole로 문 전에 기능을 만들려고 노력으로 원래 초기 테스트를 위해 하드 코딩 된 경우이 더 많거나 적은 첫 번째 패스는 foo가 이후에 전달되지 않는 코드에 있기 때문에 더 역동적 인.

foo.responseText 또는 bar을 후속 절차에서 어떻게 사용할 수 있습니까? if부터 시작하여 .done() 함수에서 조건부로 처리해야합니까?

+2

찬성 투표를하면 것을 인정에 대해 그것을 잘못 사용하고 그것이해야하는 방식으로 작동하지 않는다는 것을 말하지 않는다. – SeinopSys

+0

가까운 투표가 제거 된 이유를 모르지만 이것은 http : // stackoverflow와 중복된다.co.kr/questions/14220321/ajax-call에서 응답하는 방법 –

답변

2

.then이 아닌 .done을 찾고 있습니다.

무엇을 .done가 수행하면 어떤 동작을 수행하며과 동일한 의미의 을 반환합니다. 반면에 then은 제공된 새로운 콜백의 반환 값으로 해결되는 새로운 약속을 반환합니다. ($.ajax이 올바르게 해석되었다고 가정). 당신은 물론

는 이후에 체인하는 모든 배치해야합니다

userRole.then(function(data){ 
    var bar; 
    bar = foo.responseText; // correctly returns the JSON data 
    console.log(bar); 
    return bar; 
}).then(function(role){; 
    if (role != false) { 
    role = jsonDecode(userRole); 
    } else { 
    userRole = ""; 
    } 
//... 
    return true; 
}); 

을 당신해야 또한 return 나중에 고리에 걸고 약속이.

1

지연된 개체를 동 기적으로 사용하고있는 것처럼 보입니다 (제목에서 언급했듯이) 의도 한 목적이 아닙니다. .done() 이후에 사용자 데이터를 처리하는 코드는 해당 처리기를 등록한 직후에 실행되므로 데이터가 아직 준비되지 않습니다.

지연된 약속에 .then()을 등록하면 지연된 개체가 해결되거나 거부 된 후 코드를 실행하도록 프로그램에 지시합니다. 그 이연 객체가 해결되거나 거부 될 때까지 프로그램 은 처리 코드를 계속,을 기다리지 않습니다

예 (이연 대상 시스템의 아름다움이다!) :

var checkUserRoles = function() { 
    var userRole = roleChecker(); 

    // go off and find the user data 
    // but *don't wait for it before continuing code execution* 
    userRole.then(function(data){ 

     // at this point the AJAX request has finished, and we have the data 
     console.log(data); 

     // put code to process the user data here 
    }); 

    // code here is executed immediately after registering the .then handler 
    // so the user data has not loaded yet 
}; 

var roleChecker = function() { 
    var defer = $.Deferred(); 
    var post = defer.promise(); 

    // simulate an AJAX Request, returns after 2 seconds 
    setTimeout(function() { 
     defer.resolve('user data here!'); 
    }, 2000); 

    return post; 
}; 

checkUserRoles(); 
관련 문제