是否有可能检测到承诺链的结束

时间:2014-04-25 09:58:07

标签: javascript promise q

是否可以为promise添加句柄,以便在promise链的末尾执行。我知道有done()finally(),但是在当前承诺解决/失败后执行,而不是整个链。

编辑: 实际情况是: 基本上我有一个函数分配数据库连接并执行数据库查询,并返回一个在查询完成时解析的promise,传递连接和结果。该函数还在返回另一个promise的连接上设置查询方法,因此可以通过从then()处理程序调用查询方法并返回返回的promise来将查询链接到同一个db连接上。完成所有句柄后,db连接必须是空闲的。目前我只需要该函数的用户在last then()中手动释放连接,并在错误处理程序中自动释放它。

1 个答案:

答案 0 :(得分:4)

直言不讳:

无法检测到最终的承诺链。特别是因为您可以稍后添加内容:

var original = delay(500).then(delay(100);
// when is original done?
setTimeout(function(){
    var p = original.then(function(){ return delay(1000);});
    if(Math.random() > 0.5) p = p.then(function(){ return delay(1000); });
});

唯一的办法是做一些近似的事情:

myPromise().then(function(){
    return promise2().then(promise3).then(promise4);
}).finally(function(){
    // all promises done here
});

澄清后编辑:

Bluebird承诺通过实验允许Promise.using,这样可以让您处理像您一样想要的连接。这有点类似于C#中的using(,除了异步。

以下是API的一个示例:

function getConnection(){
    return pool.getConnectionAsync().disposer(function(conn,out){
        conn.releaseToPool();
    });
}

Promise.using(getConnection(), function(connection) {
   return connection.queryAsync("SELECT * FROM TABLE");
}).then(function(rows) {
    console.log(rows);
});

在这种情况下,只要查询完成,连接就会关闭(即内部链接完成)。最大的好处是,您不必记住使用.end,如果您与using建立了联系。

官方支持将很快登陆2.0。