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

Posted

技术标签:

【中文标题】RSVP Promises:then() 链返回链的第一个值【英文标题】:RSVP Promises: then() chain returning the first value of the chain 【发布时间】:2015-01-26 13:45:29 【问题描述】:

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

【问题讨论】:

【参考方案1】:

您似乎误解了“承诺”一词的含义。 Promise 不是“任务”,它不能像函数一样被执行或调用。 Promise 确实代表了某个操作的(异步)result,它是一个函数的返回值

如果您想要一个在需要时调用的“加载 DB”函数,请将其设为 函数(返回一个承诺),而不是一个承诺。如果你将回调传递给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 );
            
        );
    );
;

【讨论】:

以上是关于RSVP Promises:then() 链返回链的第一个值的主要内容,如果未能解决你的问题,请参考以下文章

如何动态地向promises链添加新的承诺

打破承诺链 - 停止执行下一个“then”

如何按顺序执行一系列承诺?

位于 Promise 链中间的 EventEmitter

Ember.RSVP.all 似乎立即解决

并发 TS:std::future<...>::then,如何在不存储返回的未来的情况下保持链存活?