使用 bluebird 实现更强大的 Promise(4)资源使用、定时器
- UID
- 1066743
|
使用 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);
|
|
|
|
|
|
|