2011-02-16 3 views
2

비동기 콜백은 훌륭하지만 하나의 콜백이 다른 콜백의 결과에 의존 할 때 콜백이있는 API 호출과 콜백이 있습니다.JavaScript의 비동기 프로그래밍 입문. 어떤 충고?

apiCall(function() { apiCall(function() { apiCall(function() ... 

인라인을 포함하지 않고 콜백 함수의 이름을 지정할 수 있습니다. 그것은 더 예쁘게 보이고 둥지가 적지 만 읽는 것이 더 쉽지는 않습니다.

다음은 예입니다. 로컬 sqlite 데이터베이스를 쿼리하고 결과를 사용하여 서버를 쿼리 한 다음 응답을 사용하여 로컬 데이터베이스를 업데이트해야합니다.

function sync() { 
    db.transaction(
function (transaction) { 
    execute(transaction, 'SELECT max(server_time) AS server_time FROM syncs;', [], 
     function (transaction, results) { // Query results callback 
     var t = results.rows.item(0).server_time; 
     $.post('sync.json', { last_sync_time: (t || '1980-01-01') }, 
      function (data) { // Ajax callback 
      db.transaction(
       function(transaction) { 
       $(data.thing).each(function() { 
           var thing = new Thing(this.thing); 
           thing.insert(transaction); 
          }); 
       }); 
      }); 
     }); 
}); 
} 

콜백의 이름을 지정하는 것 외에 다른 방법으로이를 언텝 할 수 있습니까?

답변

0

필자는 함수를 인라인으로 작성하는 것이 아니라 이름을 지정하여 너무 빨리 중첩되지 않는 것을 삭제할 수 있다고 생각합니다. 이것은 그 혼란을 치유하는 유일한 방법입니다. 대신

:

do_a(
    function() { 
    // more nesting... 
    } 
); 

를 사용하여 이름은 각 기능에 선명도와 목적의 비트를 제공합니다 :

function on_a_complete() { 

} 

do_a(on_a_complete); 
0

난 당신이 당신의 자신의 질문에 대답 생각합니다. 콜백의 이름을 지정하면 더 이상이를 정리할 수있는 유일한 방법입니다. 같은 뭔가 : 콜백 명명

execute(transaction, 'SELECT max(server_time) AS server_time FROM syncs;', [],handleLocalResults, errorHandler); 

handleLocalResults = function (transaction, results)... 

handleServerResults = func... 
0

은 당신이 할 수있는 한 가지이지만, 당신이해야 할 다른 일이 겹치지 않는 SQL 트랜잭션을하는 것입니다. (1)

귀하의 첫 번째 트랜잭션은 다음과 같이해야합니다 :

// The whole thing starts here 
db.transaction(selectTimeCB, null, ajaxPost); 

거래는 시간을 선택하는 콜백으로 시작하고, 거래이 완료되면 ajaxPost 작업에 전화를 걸.

// Initial transaction to get server_time 
var selectTimeCB = function(t) { 
    var query = 'SELECT max(server_time) AS server_time FROM syncs'; 
    t.executeSql(query, [], postLastSyncCB); 
}; 

// This saves the results from the above select, and nothing else. 
var server_time; 
var postLastSyncCB = function(t, results) { 
    server_time = results.rows.item(0).server_time; 
}; 

var ajaxPost = function() { 
    $.post('sync.json', { last_sync_time: (server_time || '1980-01-01') }, nextDbTransaction); 
}; 

SQL 트랜잭션이 겹쳐져 있으면 실제로 데이터베이스 성능이 저하 될 수 있습니다. 나는 최근에 500 개가 넘는 비트가있는 데이터베이스에서 200 개의 혼합 된 트랜잭션을 테스트했으며 트랜잭션을 별도로 유지하면 실행 시간이 90 초 이상 감소하여 3-5 초가 걸리는 것으로 나타났습니다.

관련 문제