【问题标题】:Is it possible to detect end of promise chain是否可以检测到承诺链的结束
【发布时间】:2014-06-10 23:23:37
【问题描述】:

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

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

【问题讨论】:

  • 全链是什么意思?你能举个例子解释一下吗?
  • 你能用all()吗?如果没有示例,我不完全确定您要做什么。
  • 已编辑问题以添加实际案例
  • 你应该添加你真正想做的事情
  • @Esailija 10$ 说它正在使用。编辑:nvm,OP 已经确认它是Promise.using

标签: javascript promise q


【解决方案1】:

坦率地说:没有

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

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。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2015-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-07
  • 1970-01-01
相关资源
最近更新 更多