[英]RSVP Promises: then() chain returning the first value of the chain
我目前正在嘗試將一些indexedDB代碼包裝到promise中。
我有一個“加載數據庫”功能為:
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
滿足的值。 我該如何解決? 有沒有更好的方法可以實現相同的目標?
您似乎誤解了“承諾”一詞的含義。 一個承諾不是一個“任務”,它不能像函數可以執行或調用。 一個promise確實表示某個動作的(異步) 結果 ,它是一個函數的返回值 。
如果要在需要時調用“加載數據庫”函數,請將其設為函數 (返回諾言),而不是諾言。 如果您向then
傳遞了一個回調, then
傳遞一個函數 ,而不是一個promise。
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 );
}
});
});
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.