2013-12-10 3 views
1

async.js와 함께 WebSQL API를 사용하면보다 쉽게 ​​사용할 수 있습니다. 나는 하나의 함수에서 다른 함수로 트랜잭션 객체를 전달하기 위해 async.waterfall() 메서드를 사용한다. Uncaught InvalidStateError: An attempt was made to use an object that is not, or is no longer, usable.
매우 가능성이이 tx 객체를 참조 : 나는 tx.executeSql() 크롬의 콘솔 말한다 호출하면async.js와 함께 WebSQL을 사용하면 InvalidStateError가 발생합니다.

async.waterfall([function(callback) { 
    db.transaction(function(tx) { 
     callback(null, tx); 
    }, onError); 

}, function(tx, callback) { 
    tx.executeSql('SELECT * FROM sqlite_master', [], function(tx, rs) { 
     callback(null, tx, rs); 
    }, onError); 

}], function(tx, rs) { 
    // do something with rs.rows 

}); 

: 다음은 간단한 예입니다.

WebSQL을 사용하는 전통적인 방법 ('함수 폭포'생성)은 잘 작동합니다. 거기에 내가 그런 방식으로 WebSQL을 사용하는데주의를 기울여야 할 것이 있습니까? 아니면 더 나은 대안이 있습니까?

+0

왜 트랜잭션 오브젝트를 통과하고 싶은가? – Astronaut

+1

SQL 문을 실행해야하기 때문에. 아직 모르는 대안이 있습니까? –

답변

2

그래, 난 WebSQL은 async.waterfall()와 함께 어떤 이유로 작동하지 않는 알았어. async.series()을 사용하는 다음 코드는 정상적으로 작동합니다. 또한 당신이 waterfall() 주위에 함수를 포장해도 작동하지 않습니다. 아직

, waterfall()이 경우에 좋은 것 ... series()transaction() 내부와

근무 예 :

db.transaction(function(tx) { 
    async.series([ 
     function(callback) { 
      tx.executeSql('DROP TABLE IF EXISTS colors', [], 
       function(tx, rs) { callback(null, rs); }, 
       function(err) { callback(err); }); 
     }, 
     function(callback) { 
      tx.executeSql('CREATE TABLE IF NOT EXISTS colors (name, red, green, blue)', [], 
       function(tx, rs) { callback(null, rs); }, 
       function(err) { callback(err); }); 
     }, 
     function(callback) { 
      tx.executeSql('INSERT INTO colors VALUES ("red", 255, 0, 0)', [], 
       function(tx, rs) { callback(null, rs); }, 
       function(err) { callback(err); }); 
     }, 
     function(callback) { 
      tx.executeSql('SELECT * FROM colors', [], 
       function(tx, rs) { callback(null, rs); }, 
       function(err) { callback(err); }); 
     } 
    ], 
    function(err, results) { 
     if (!!err) { onError(err); } 

     console.debug(results[3].rows.item(0)); 
    }); 
}); 
+0

http://pouchdb.com/2014/10/26/10-things-i-learned-from-reading-and-writing-the-pouchdb-source.html에 따르면 WebSQL은 이벤트 루프로 돌아갈 때 트랜잭션을 자동 종료합니다 . 이것은 async.series가 작동하지만 async.waterfall이 작동하지 않는 이유를 설명합니다. –

관련 문제