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() 链返回链的第一个值的主要内容,如果未能解决你的问题,请参考以下文章