我目前正在尝试将一些indexedDB代码包装到promises中。
我有一个"加载db"功能如:
db.load = new RSVP.Promise( function ( fulfill , reject ) {
//...
if (globaldb) {
fulfill(globaldb);
return;
}
//...
request.onsuccess = function(e) {
globaldb = e.target.result;
fulfill(globaldb);
}
});
我的意图是在第一个调用的DB函数上加载db,保存对它的引用并在后续请求中重用它。
db.query = function( objectStoreName , options ) {
var queryPromise = new RSVP.Promise( function ( fulfill , reject ) {
//... do some work
transaction.oncomplete = function() {
fulfill( anArray );
}
});
return db.load.then(queryPromise);
}
最后,尝试使用上面创建的包装器:
db.query("tablename", ... ).then( function ( data ) {
//do things, write to the screen, etcetera
});
最终data
包含db.load
履行的值,而不是db.query
履行的值。我该如何解决这个问题?有没有更好的方法来实现同一目标?
答案 0 :(得分:0)
您似乎误解了“承诺”一词的含义。承诺不是“任务”,它不能像函数一样执行或调用。 promise确实表示某个操作的(异步)结果,它是函数的返回值。
如果您需要在需要时调用的“加载DB”功能,请将其设为功能(返回承诺),而不是承诺。如果您将回调传递给then
,请传递函数,而不是承诺。
var globaldb = null;
db.load = function() {
if (globaldb) {
return globaldb;
} else {
return globaldb = new RSVP.Promise( function ( fulfill , reject ) {
//...
request.onsuccess = function(e) {
fulfill(e.target.result);
};
});
}
};
db.query = function( objectStoreName , options ) {
return db.load().then(function(conn) {
// ^^ ^^^^
// call it here! the result of loading the database
return new RSVP.Promise( function ( fulfill , reject ) {
//... do some work
transaction.oncomplete = function() {
fulfill( anArray );
}
});
});
};