簡體   English   中英

RSVP承諾:then()鏈返回鏈的第一個值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM