2012-09-16 3 views
5

나는 다음 코드를 사용하여 기능 db.transaction를 호출 오전 :WebSQL 콜백 함수에 여분의 매개 변수를 전달 하시겠습니까?

db.transaction(createSheetDB, function(){alert("Sheet creation error!")}, function(){alert("Sheet created!")}); 

함수 createSheetDB는 암시 또한 매개 변수 TX 통과하는() db.transaction에 의해 호출되는 콜백 함수입니다. 이 같은 기능 createSheetDB (TX)를 구현 한 :

function createSheetDB(tx) { 
var nextId = getNextId(); 
tx.executeSql("INSERT INTO SHEET(id, name, desc) VALUES("+nextId+",'"+sheetName+"','"+desc+"')", [], 
     function(){alert("Sheet row inserted!")}, 
     function(tx, err){alert("Sheet row insertion Error: "+err.message+" "+err.code)} 
);} 

이제 문제는 SHEETNAME과 내림차순의 값입니다 만 호출 함수에서 사용할 수 있습니다. 그것들을 함수 createSheetDB (tx)에 어떻게 전달합니까?

+1

* 많은 * 질문/일반적인 경우에 대한 답변 (다음 실제 콜백 함수를 호출 지역 변수에 결합 클로저를 사용하거나 실제 콜백을 정의 할 수 있습니다 같은 어휘 범위에서 ..), 잘하면이 * 세련된 경우 * 더 적용됩니다 ..하지만 WebSQL을 사용하지 마십시오. –

+0

감사합니다. @pst, 현재 내 문제를 해결하기 위해이 방법을 사용하고 있습니다. –

답변

3

원하는 변수를 닫을 수있는 새로운 콜백을 만드는 기술을 사용할 수 있습니다. 함수로

function doStuff(callback) { 
    var val = 43; 
    callback(val); 
} 

function myCallback(val, anotherVal) { 
    alert("val: " + val + "\nanotherVal: " + anotherVal); 
} 

(function() { 

    var anotherVal = "Whoa!", 
     anotherCallback = function(val) { 
      return myCallback(val, anotherVal); 
     }; 

    doStuff(anotherCallback); 

}());​ 
+0

고마워요 @ 조쉬,이 솔루션은 샤크에서 나온 것보다 나에게 깨끗해 보인다. –

1

콜백 생성

function createSheetDB(sheetName, desc) { 
    return function(tx){ 
     var nextId = 1; 
     alert("INSERT INTO SHEET(id, name, desc) VALUES("+nextId+",'"+sheetName+"','"+desc+"')"); 
     /* delete above two lines and uncomment for your code 
     var nextId = getNextId(); 
     tx.executeSql("INSERT INTO SHEET(id, name, desc) VALUES("+nextId+",'"+sheetName+"','"+desc+"')", [], 
      function(){alert("Sheet row inserted!")}, 
      function(tx, err){alert("Sheet row insertion Error: "+err.message+" "+err.code)} 
     ); 
     */ 
    } 
} 

// dummy code to show as example 
db = {transaction: function(fn,lose,win){return fn(),win();}}; 

function testIt(){ 
    var sheetName = 'hello', 
     desc = 'world'; 
    db.transaction(createSheetDB(sheetName, desc), function(){alert("Sheet creation error!")}, function(){alert("Sheet created!")}); 
    // note how createSheetDB is now called with the vars you want 
} 
+0

감사합니다. @shhac. 이 솔루션은 좋아 보인다. 그러나 나에게 조쉬의 사람은 깨끗해 보인다. 그것이 나 일 수는 있지만. ;) –

+0

그 정도면 충분합니다. 조시 (Josh)가 변수를 따르는 것을 더 어렵게한다는 것을 알았을 것입니다. 코드의 큰 부분에서 저는 그것들을 모두 하나의 함수로 유지합니다. –

관련 문제