Javascript RSVP承诺:then()chain返回链的第一个值

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

我目前正在尝试将一些indexedDB代码包装成承诺

我有一个“load 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
});

最后,
数据
包含由
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 );
            }
        });
    });
};