javascript - 是否有可能检测到 promise 链的结束

标签 javascript promise q

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

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

最佳答案

直言不讳:

没有办法检测结束 promise 链。特别是因为您可以稍后添加内容:

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 promises 实验性地允许 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);
});

在这种情况下,连接会在查询完成后立即关闭(也就是说,内部链接已完成)。最大的优势是您不必记住使用。结束是您通过using获得连接。

官方支持即将登陆2.0。

关于javascript - 是否有可能检测到 promise 链的结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23289845/

相关文章:

javascript - Jquery 用于除焦点之外的每个输入元素

javascript - 为什么解析 geojson 文件后在浏览器中看不到 map ?

javascript - 完成 Promise 链

javascript - 这是一种常见的模式吗? (返回数据而不是返回 promise )

javascript - 'chunked' 响应进入 AngularJS 后立即显示的方法是什么?

javascript - q then 与 2 个函数和 then 后跟 catch 之间的区别

javascript - Q promise .then() 未定义

javascript - 使用滚动条淡入一堆图像(div)

javascript - ionic /如何期望刷新缓存 View ?

javascript - 如何记录来自 fetch api 的响应