Javascript 有可能检测到承诺链的末端吗

Javascript 有可能检测到承诺链的末端吗,javascript,promise,q,Javascript,Promise,Q,是否可以向承诺添加句柄,使其在承诺链的末尾执行。我知道有done()和finally(),但它们是在当前承诺解决/失败后执行的,而不是整个链条 编辑: 实际情况是: 基本上,我有一个函数来分配一个db连接并执行一个db查询,并返回一个在查询完成时得到解决的承诺,传递连接和结果。该函数还对返回另一个承诺的连接设置一个查询方法,因此可以通过从then()处理程序调用查询方法并返回返回的承诺,将查询链接到同一个db连接上。完成所有句柄后,db连接必须是空闲的。目前,我只需要函数的用户在last the

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

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

直截了当地说:

没有办法检测最终承诺链。特别是因为您可以在以后添加内容:

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

澄清后编辑:

蓝鸟承诺实验性地允许
承诺。使用
,这将允许您按照自己的意愿处理连接。这有点类似于C语言中使用()的
,除了异步之外

下面是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
是使用
获得与
的连接


官方支持很快将在2.0中登陆。

坦率地说:

无法检测最终承诺链。尤其是因为您可以稍后添加内容:

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

澄清后编辑:

蓝鸟承诺实验上允许
承诺。使用
,这将允许您按照自己的意愿处理连接。这与C#中的
使用(
)有点类似,只是异步

下面是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
是使用
获得与
的连接


官方支持将很快登陆2.0。

什么是全链?请举例说明?您能使用
all()吗
?如果没有一个例子,我不能完全确定你想做什么。编辑问题以添加实际案例你应该添加你真正想做的do@Esailija10美元表示它正在使用。编辑:nvm,OP已经确认它是
承诺。使用
。整条链是什么意思?你能举例说明吗?你能使用
all()吗
?如果没有一个例子,我不能完全确定你想做什么。编辑问题以添加实际案例你应该添加你真正想做的do@Esailija10美元表示正在使用。编辑:nvm,OP已经确认它是
承诺。使用
处理器(“关闭”)
不受任何支持:P@Esailija太:PClassic petka,删除不推荐使用的分支以赢得堆栈溢出中的注释参数:P
disposer(“close”)
不受任何支持:P@Esailija太:PClassic petka,删除不推荐使用的分支以赢得堆栈溢出中的注释参数:P