RSVP Promises:then()链返回链的第一个值

时间:2014-11-27 22:32:57

标签: javascript promise rsvp.js

我目前正在尝试将一些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履行的值。我该如何解决这个问题?有没有更好的方法来实现同一目标?

1 个答案:

答案 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 );
            }
        });
    });
};