2012-10-08 3 views
0

자바 스크립트에서 Google 애널리틱스 API를 사용하고 있습니다.JavsScript에서 동기 래퍼를 어떻게 구현합니까?

목록의 결과를 가져 오는 메소드를 제공합니다. 일단 실행이 완료되면 결과와 함께 콜백 메소드를 호출합니다.

gapi.client.analytics.management.accounts.list().execute(handleAccounts); 

...

function handleAccounts(results) { 
     if (!results.code) { 
     if (results && results.items && results.items.length) { 

// See this code below. 

     } else { 
      console.log('No accounts found for this user.') 
     } 
    } else { 
     console.log('There was an error querying accounts: ' + results.message); 
    } 
} 

는 일반적으로이, 그러나 ... 나는 그래서 이렇게 계속 전화 모든 하위 항목의 평평 목록을 환상적인 필요가있다 :

는 다음과 같이 보이는 :

$.each(results.items, function (index, value) { 

gapi.client.analytics.management.webproperties.list({ 'accountId': value.Id}).execute(handleWebproperties); 
// and so on.. 
      }) 

어떤 레벨에서든 여러 개의 항목이있는 경우 여러 개의 비동기 정식으로 전화를 끊고, 최종 목록을 얻기 위해 다 끝났을 때 나는 알 수 없을 것입니다.

전화가 몇 번 있었는지 추적하여 그 총계가 다시 돌아 오기를 기다리는 것을 쓰기보다는.

어떻게 완료했는지 쉽게 알 수 있습니까?

감사합니다. 요약

:

사용자가 여러 계정을 가질 수 있습니다, 계정은 여러 속성을 가질 수 있으며 속성은 여러 프로필을 가질 수 있습니다.

사용자의 모든 계정에 대해 모든 프로필이 필요합니다.

+0

다음을 참조하십시오. http://stackoverflow.com/questions/4631774/coordinating-parallel-execution-in-node-js/4631909#4631909 – slebetman

답변

0

jQuery Deferred 기능을 사용하면 이러한 종류의 작업을 수행 할 수 있습니다. 기본적으로 지연 객체에 콜백을 래핑하는 경우 $.when(...)을 사용하여 모두 함께 그룹화합니다.

이런 식으로 (당신에게 가장 적합한 정확한 구조는 당신이 그것을 어떻게 사용하는지에 달려 있습니다.이 코드는 각 콜백에서 특정 작업을 수행 할 필요가있을뿐만 아니라 모든 상황을 알 필요가 있다고 가정합니다.

var promises = []; 
$.each(results.items, function (index, value) { 
    var deferred = new $.Deferred(); 
    gapi.client.analytics.management.webproperties.list({ 'accountId': value.Id}).execute(function(results) { 
     handleWebproperties(results); 
     deferred.resolve(); 
    }); 
    promises.push(deferred.promise()); 
    // and so on... 
}); 

$.when.apply(this, promises).done(function() { 
    alert("Everything is finished!"); 
}); 

참고 난 그냥 똑바로 브라우저 창에 코딩, 그래서이 100 % 작동하지 않을 수 있습니다) 다. :)

+0

그 한 가지 일은 $입니다. 언제입니까? 정의되지 않았습니까? – shenku

+0

@shenku - jQuery (v1.5 이상)를 사용하고 계십니까? – Alconja

+0

jquery 그냥 빨리로드하지 않은 지금 구현하고 알려주는 방법을 알려 ... – shenku

0

이 문제를 해결하려면 얼마나 많은 비동기 호출을했는지 (또는 만들 예정인지) 추적하고 각 응답에서 카운트를 줄이고 마지막 명령이 완료되었는지 확인하십시오. 하나의 응답이 오류를 생성하고 성공적으로 완료되지 않을 경우 강력한 오류 처리 기능이 있는지 확인하는 것이 중요합니다.

이 옵션을 알고있는 것처럼 보이고 왜 이것을 추구하지 않는지 불분명하지만 해결 방법이 있습니다. 마지막으로 수행 한 작업을 추적하기 위해 jQuery deferreds을 사용하는 것도 가능하지만 이는 라이브러리를 사용하여 계산을 수행하는 것입니다. 여전히 근본적으로 같은 것입니다.

+0

그래, 나는 더 간단한 방법이 있어야한다고 생각합니다. 이러는거야? 아니면 JQuery 구성 요소 또는 나를 위해 그것을 깔끔하게 감쌀 수있는 무언가? – shenku

+0

@shenku - 내 답변에 추가 한 것처럼 [jQuery deferreds] (http://api.jquery.com/category/deferred-object/)를 사용하면 라이브러리를 사용하여 추적 할 수 있습니다. 이거 당신을 위해서. – jfriend00

0

이전 답변으로 작성한 fork 기능을 기반으로합니다 : Coordinating parallel execution in node.js. 나는 이런 식으로 할 것 : fork의 구현은,이

var queryFunctions = [] 
$.each(results.items, function (index, value) { 
    queryFunctions.push(function(callback){ 
     gapi.client.analytics.management. 
      webproperties.list({ 'accountId': value.Id}). 
      execute(callback); 
    }); 
}) 

fork(queryFunctions,function(result){ 
    // This is the final callback, so do processing here 
}) 

입니다

: 당신이 볼 수 있듯이, 그것은 않습니다 모두가 counter 이루어진 것으로, 얼마나 많은 통화를 추적하다

function fork (async_calls, shared_callback) { 
    var counter = async_calls.length; 
    var all_results = []; 
    function makeCallback (index) { 
    return function() { 
     counter --; 
     var results = []; 
     // we use the arguments object here because some callbacks 
     // in Node pass in multiple arguments as result. 
     for (var i=0;i<arguments.length;i++) { 
     results.push(arguments[i]); 
     } 
     all_results[index] = results; 
     if (counter == 0) { 
     shared_callback(all_results); 
     } 
    } 
    } 

    for (var i=0;i<async_calls.length;i++) { 
    async_calls[i](makeCallback(i)); 
    } 
} 

변하기 쉬운. 그러나 그것은 모두 하나의 기능으로 캡슐화되어 있기 때문에 논리를 다시 사용할 수 있습니다. 또한, 코드를 더 깔끔하게 만든다고 생각합니다.

관련 문제