2012-09-16 30 views
5

tôi kêu gọi một hàm db.transaction với đoạn mã sau:Chuyển các tham số bổ sung vào chức năng gọi lại WebSQL?

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

Chức năng createSheetDB là một hàm callback được mặc nhiên được gọi bởi db.transaction() mà cũng vượt qua nó một tham số tx. Tôi đã triển khai hàm createSheetDB (tx) như sau:

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

Bây giờ vấn đề là giá trị của sheetName và desc chỉ có sẵn trong chức năng gọi. Làm cách nào để chuyển chúng vào hàm createSheetDB (tx)?

+1

Có * nhiều * câu hỏi/câu trả lời đối với trường hợp chung (sử dụng một kết thúc mà liên kết với các biến địa phương sau đó gọi hàm callback thực hoặc xác định gọi lại thực chức năng trong cùng phạm vi từ vựng hoặc ..), vì vậy hy vọng trường hợp * tinh tế này sẽ được áp dụng nhiều hơn .. nhưng tôi không sử dụng WebSQL. –

+0

cảm ơn @pst, tôi hiện đang sử dụng cách này để giải quyết vấn đề của mình. –

Trả lời

3

Bạn có thể sử dụng kỹ thuật theo đó bạn tạo một cuộc gọi lại mới sẽ đóng trên các biến mà bạn muốn.

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

Cảm ơn @Josh, Giải pháp này trông sạch hơn với tôi so với một từ shaac. –

1

tạo Callback là một hàm

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

Cảm ơn @shhac. Giải pháp này có vẻ tốt. Nhưng đối với tôi, hình ảnh của Josh trông sạch hơn. Mặc dù nó chỉ có thể là tôi. ;) –

+0

Điều đó là công bằng. Tôi sẽ tìm cách của Josh khó hơn để theo dõi các biến trong, trong một đoạn mã lớn, đó là lý do tại sao tôi giữ tất cả chúng lại với nhau chỉ là một hàm. –

Các vấn đề liên quan