2015-01-19 3 views
1

$.ajax(type: 'GET', data: ticket) 여기서 ticket은 인증 토큰입니다. ticket은과 같이 획득 :중첩 지연된 AJAX 호출을 통한 반복

var newTicket = $.ajax({ 
       type: 'POST', 
       dataType: 'jsonp', 
       jsonp: 'callback', 
       jsonpCallback: 'JsonPCallBack', 
       data: {}, 
       url: "https://api.examample.com?username=bar&password=foo", 
     }); 

내가 얻은 후에는 내 ticket 내가 할 수있는 내 GET :

function getData(ticket, query) { 
      return $.ajax({ 
       type: 'GET', 
       dataType: 'jsonp', 
       jsonp: 'callback', 
       jsonpCallback: 'JsonPCallBack', 
       data: ticket, 
       url: "https://api.examample.com/?data=" + query, 
      }); 
     } 

함께 퍼팅 :

 newTicket.done(function(ticket) { 

      var ticket = ticket; 
      getData(ticket, query).done(function(result) { 

       console.log(result); 

      }); 
     }); 

이 잘 완벽하게 작동 - 내 두 전화가 확실히 작동합니다.

제 질문은 많은 값인 query에 대해이 호출을 다시하고 싶습니다. 내가 시도한 것은 다음과 같습니다.

// example.com promises me that I can use ticket for multiple requests 
// for one ticket I will try and do multiple requests 

newTicket.done(function(ticket) { 

    var deferred = $.Deferred(); 
    var ticket = ticket; 

    // Inspired by http://stackoverflow.com/questions/5627284/pass-in-an-array-of-deferreds-to-when 
    requests = []; 

    for (i in queries) { 
     query = queries[i]; 
     requests.push(getData(ticket, query)); 
    } 

    $.when.apply($, requests).done(function(result) { 
     for(var i = 0; i < arguments.length; i++) { 
      console.log(calculateData(arguments[i][0])); 
     } 
    }); 

}); 

그러나 이것은 작동하지 않습니다. 나는 이유를 알 수 없다. 어떤 충고?

이 코드 추가 시도 :

.fail(function(jqXHR, textStatus, errorThrown) { 
      console.log('jqXHR: ' + jqXHR); 
      console.log('textStatus: ' + textStatus); 
      console.log('errorThrown: ' + errorThrown); 
     }); 

을 그리고이 내게 준 :

jqXHR: [object Object] 
textStatus: parsererror 
errorThrown: Error: JsonPCallBack was not called 

업데이트 : JSONP를 지정하지 않은 경우이 하나의 요청이있는 간단한 경우가 작동하지 않습니다 및 JsonPCallBack. jsonp 및 JsonPCallBack을 지정하면 작동합니다.

내 배열에서 두 개의 요청으로 코드를 실행 해 보았습니다. 패킷을 스니핑하면 상태 코드 200 OK로 두 가지 요청이 이루어진다는 것을 알 수 있습니다. 응답은 JsonPCallBack({으로 시작하고 올바른 데이터를 포함합니다. 그래서 실제의 repsonse를 보면 모든 것이 정확 해 보입니다. .fail()에 도달하는 이유는 무엇입니까?

+0

는 당신이'$의 .when.apply'에'실패()'처리기를 추가하려고 했습니까? 'done' 핸들러가 호출되는지 확인하고 있습니까? 이 문제를 해결하려고 시도한 증거는 보이지 않았습니다. – JLRishe

+0

감사. 나는 나의 대답을 업데이트했다. – user1965074

+0

어떤 방식으로 작동하지 않습니까? –

답변

0

모든 요청에 ​​대해 단일 콜백을 사용한다는 것이 중요합니다. 당신은 jsonpCallback: 'JsonPCallBack'를 제거하고 서버가 clientCallBack + 같은 콜백 매개 변수를 사용해야한다 "("+ JSON + ")"

0

jsonpCallback 매개 변수는 JSONP 응답을 포장에 사용하는 함수 이름의 이름을 나타냅니다. jQuery는 리턴 된 데이터를 처리 할 수 ​​있도록 호출되기를 기다리는이 이름을 가진 함수를 자동으로 설정합니다.

당신은 요청 모든이 같은 기능 이름을 기다리고있을 것입니다 것을 의미한다이 매개 변수에 대한 명시 적 값을 지정하고, 하는 모든 응답 같은 함수 이름을 호출 할 것이며, 그것은 것입니다 완전한 혼란이 되십시오. 응답을 올바로 라우팅 할 방법이 없습니다.

매개 변수 또는 jsonp 매개 변수를 지정하지 마십시오. 권장할만한 방법은 특정 이유가 없으면 사용하지 않는 것입니다. 보조 노트, 요청의 배열을 생성하는 코드로

간소화 할 수 있습니다

var requests = $.map(queries, function (query) { 
    return getData(ticket, query); 
}); 
+0

감사합니다. 이게 내 문제를 해결했습니다. – user1965074