2012-09-16 18 views
5

Aşağıdaki kod ile bir işlev db.transaction çağrı am:WebSQL geri arama işlevine ek parametreler iletin mi?

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

fonksiyonu createSheetDB dolaylı da bir parametre tx geçtiği() db.transaction tarafından çağrılan bir geri çağrı işlevidir. Böyle fonksiyon createSheetDB (tx) uyguladık:

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)} 
);} 

Şimdi problem SHEETNAME ve desc değerleri sadece çağıran işlevi mevcuttur. Onları createSheetDB (tx) işlevine nasıl aktarabilirim?

+1

* Birçok * soru/jenerik durum için cevaplar (sonra gerçek geri çağırma işlevi çağırır yerel değişkenlere bağlanan bir kapatma kullanmak veya gerçek geri arama tanımlamak vardır Aynı sözcük kapsamı veya ..) fonksiyon, bu yüzden bu durumda * rafine durumda * daha uygulanabilir olacak .. ama WebSQL kullanmıyorum. –

+0

teşekkürler @pst, Şu anda sorunumu çözmek için bu yolu kullanıyorum. –

cevap

3

İstediğiniz değişkenleri kapatacak yeni bir geri arama oluşturduğunuz bir teknik kullanabilirsiniz. bir fonksiyonu olarak

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

Teşekkürler @Josh, Bu çözüm bana shaac'tan daha temiz görünüyor. –

1

Geri arama oluşturma

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

Teşekkürler @shhac. Bu çözüm iyi görünüyor. Ama bana göre Josh'dan biri daha temiz görünüyor. Sadece ben olabilirdim. ;) –

+0

Bu yeterince adil. Josh'un büyük bir kod parçasındaki değişkenleri takip etmesinin daha zor olduğunu ve bu yüzden hepsini tek bir işlev olarak bir arada tuttuğumu görebiliyordum. –