2013-02-24 3 views
0

JSONP 요청과 동 기적으로 만들 수없는 사실에 대한 많은 질문이 있습니다. 대부분의 해결 방법에는 콜백 또는 Ajax 요청의 성공 함수를 사용하여 원하는 작업을 수행하는 것이 포함되지만 이는 저에게 맞지 않을 것이라고 생각합니다.동기식 JSONP 요청

배경 : Solr을 사용하는 검색 응용 프로그램에서 작업하고 있습니다. 다른 사람들이 Solr과 상호 작용하는 데 사용할 자바 스크립트 API를 개발 중이므로 Solr 검색 요청을 자세히 이해할 필요가 없습니다.

내 API에는 doRequest라는 함수가있는 Request 개체가 있습니다. 이 함수의 목적은 solr 서버 (다른 도메인에서 JSONP가 필요함)를 호출하고 Response 객체를 반환하는 것입니다.

Request.prototype.doRequest = function(){ 
var res = new Response(); 
$.ajax({ 
    url: this.baseURL, 
    data: 'q=*:*&start=0&rows=10&indent=on&wt=json', 
    success: function(data){ 
     res.response = data.response; 
     res.responseHeader = data.responseHeader; 
     /* 
      other... 
      stuff... 
     */ 
    }, 
    dataType: 'jsonp', 
    jsonp: 'json.wrf' 
}); 
res.request = this; 
return res; 
}; 

"사용자는 ..."과 같이

var req = new Request(); 
var res = req.doRequest(); 

을이 기능을 사용하고 고해상도의 결과로 무언가 다른 할 것입니다.

동기 JSONP 요청을 수행 할 수없고 ajax 함수에서 복귀 할 수 없다는 것을 감안할 때 어쨌든 res를 완전히 사용하기 전에 알아낼 수 없습니다.

고마워,

+3

사용자가 콜백 함수를 작성하지 않아도되는 이유는 무엇입니까? Javascript의 많은 부분은 비동기식으로 작업하는 방법을 이해할 필요가 있습니다. 오랫동안 초보자 만 보호 할 수 있습니다. –

+0

비동기는 전염성이 있습니다. 컨트롤 흐름의 한 부분이 콜백을 사용하면 컨트롤 흐름의 나머지 부분도 콜백을 사용합니다. 나는이 문제를 해결할 길이 없다고 생각합니다. Javascript의 기쁨과 공포 중 하나. –

+0

실제로 방법이 있지만 컴파일 단계가 필요합니다. https://npmjs.org/package/streamline –

답변

0

콜백 기능을 사용하는 것처럼 보입니다. 당신이 관심이있는 경우를 대비해서 내가 어떻게 끝내 었는지.

Request.prototype.doRequest = function (callback){ 
var res = new Response(); 
$.ajax({ 
    url: this.baseURL, 
    data: 'q=*:*&start=0&rows=10&indent=on&wt=json', 
    success: function(data){ 
     res.response = data.response; 
     res.responseHeader = data.responseHeader; 
     res.request = this; 
     /* 
      other... 
      stuff... 
     */ 
     callback(res); 
    }, 
    dataType: 'jsonp', 
    jsonp: 'json.wrf' 
}); 
}; 

그리고 이제 사용자는 그렇게 같은 함수를 사용 parseResults이 파라미터로 응답 오브젝트를 사용자에 의해 정의 된 콜백 함수

var req = new Request(); 
var res = req.doRequest(parseResults); 

.

function parseResults(res){ 
    //Doing work 
} 
0

나머지 프로그램의 동기 여부에 관계없이 REST 인터페이스를 동시에 터치해야하는 경우가 있습니다. 예를 들어 자산 배열 (예 : 자산 ID)을 가져온 다음 ID 전체를 수화하여 전체 데이터/자산을 얻으려는 요청이있는 경우를 예로들 수 있습니다. Ooyala API를 사용했다면, 내가 의미하는 바를 알 수 있습니다.

이전 요청이 완료된 후에 만 ​​다음 요청을 실행할 수 있도록하는 첫 번째 동기 JSONP 모듈을 만들었습니다. Promises 대신 재귀를 사용하므로 이전 요청이 성공할 때까지 다음 요청이 전송되지 않습니다. API는 여기에 있습니다. https://github.com/cScarlson/jsonpsync

희망이 있습니다.