首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

使用 bluebird 实现更强大的 Promise(4)资源使用、定时器

使用 bluebird 实现更强大的 Promise(4)资源使用、定时器

资源使用如果在 Promise 的代码中使用了需要释放的资源,如数据库连接,确保这些资源被释放并不是一件容易的事情。一般的做法是在 finally                中添加资源释放逻辑。但是当 Promise 互相嵌套时,很容易产生资源没有被释放的情况。Bluebird                提供了更加健壮的资源管理方式,即使用资源释放器(disposer)和 Promise.using 方法。
资源释放器以 Disposer 对象表示,通过 Promise 的 disposer                方法来创建。创建时的参数是一个用来释放资源的方法。该方法的第一个参数是资源对象,第二个参数是 Promise.using 产生的 Promise                对象。Disposer 对象可以传递给 Promise.using 来保证其资源释放逻辑被执行。
在代码清单13中,Connection 表示数据库连接,DB 表示数据库。DB 的                connect 方法创建一个数据库连接,返回的是 Promise 对象。Connection 的 query                方法表示执行数据库查询,返回结果也是一个 Promise 对象。Connection 的 close 方法关闭数据库连接。在使用时,在                connect 方法返回的 Promise 对象之上使用 disposer 来创建一个 Disposer 对象,所对应的资源释放逻辑是调用                close 方法。接着就可以通过 Promise.using 来使用 Connection 对象。
清单13.                Promise 的资源管理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
const Promise = require('bluebird');

class Connection {
query() {
   return Promise.resolve('query');
}
close() {
   console.log('close');
}
}

class DB {
connect() {
   return Promise.resolve(new Connection());
}
}

const disposer = new DB().connect().disposer(connection => connection.close());
Promise.using(disposer, connection => connection.query())
.then(console.log).catch(console.error);




定时器Promise.delay 返回的 Promise 会在指定的时间之后转换到已满足状态,并使用指定的值作为结果。Promise.timeout                用来为一个已有的 Promise 添加超时功能。如果已有的 Promise 没有在指定的超时时间内完成,结果 Promise 会产生                TimeoutError 错误。
在代码清单14中,第一个 delay                方法会在1秒后输出 hello。第二个方法会抛出 TimeoutError 错误,因为 delay 的延迟时间1秒超过了超时时间500毫秒。
清单14. Promise.delay 和 Promise.timeout 的使用示例
1
2
3
4
5
6
Promise.delay(1000, 'hello').then(console.log);

Promise.delay(1000, 'hello')
.timeout(500, 'timed out')
.then(console.log)
.catch(console.error);

返回列表