Javascript RSVP承诺:then()chain返回链的第一个值
我目前正在尝试将一些indexedDB代码包装成承诺 我有一个“load db”功能,如下所示:Javascript RSVP承诺:then()chain返回链的第一个值,javascript,promise,rsvp.js,Javascript,Promise,Rsvp.js,我目前正在尝试将一些indexedDB代码包装成承诺 我有一个“load db”功能,如下所示: db.load = new RSVP.Promise( function ( fulfill , reject ) { //... if (globaldb) { fulfill(globaldb); return; } //... request.onsuccess = function(e) { global
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
});
最后,
数据
包含由db.load
实现的值,而不是由db.query
实现的值。我怎样才能解决这个问题?有没有更好的方法来实现同样的目标?你似乎误解了“承诺”这个词的含义。承诺不是“任务”,它不能像函数那样被执行或调用。承诺确实表示某些操作的(异步)结果,它是函数的返回值
如果您希望在需要时调用“loaddb”函数,请将其设置为函数(返回承诺),而不是承诺。如果将回调传递给,则传递函数,而不是承诺
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 );
}
});
});
};