有没有正确的方法来存储已解决的承诺?
Is there right way to store resolved promises?
现在几乎每个节点包都有回调api。如果我正在围绕它编写包装器,例如 ORM 怎么办:
const Promise = require('bluebird');
const mongo = Promise.promisifyAll(require('mongodb'));
class ORM {
constructor(mongoUrl) {
this.db = mongo.connectAsync(mongoUrl);
}
collection(name) {
return this.db.then((db) => {
return db.collectionAsync(name);
});
}
}
这是正确的方法吗?
好吧,promise 只是代表价值 + 时间的价值的代理。
你所做的一切都很好。 存储 promises 没问题, 事实上,通常 更好 存储 promises 而不是它们持有的值,因为这样你会得到更少的竞争条件.
您所做的唯一问题是错误处理。假设连接失败 - 在实际向数据库发出请求之前,您不会对其做出反应或检测到它,这没有太大意义。您应该决定如何处理构造函数中的连接失败并进行处理。
如果您想明确禁止检测到未处理的拒绝,您可以这样做:
this.db = mongo.connectAsync(mongoUrl);
this.db.catch(() => {});
虽然我个人不建议这样做,但您或许应该有重新连接逻辑,如果多次重新连接尝试失败,甚至可能使服务器崩溃。
现在几乎每个节点包都有回调api。如果我正在围绕它编写包装器,例如 ORM 怎么办:
const Promise = require('bluebird');
const mongo = Promise.promisifyAll(require('mongodb'));
class ORM {
constructor(mongoUrl) {
this.db = mongo.connectAsync(mongoUrl);
}
collection(name) {
return this.db.then((db) => {
return db.collectionAsync(name);
});
}
}
这是正确的方法吗?
好吧,promise 只是代表价值 + 时间的价值的代理。
你所做的一切都很好。 存储 promises 没问题, 事实上,通常 更好 存储 promises 而不是它们持有的值,因为这样你会得到更少的竞争条件.
您所做的唯一问题是错误处理。假设连接失败 - 在实际向数据库发出请求之前,您不会对其做出反应或检测到它,这没有太大意义。您应该决定如何处理构造函数中的连接失败并进行处理。
如果您想明确禁止检测到未处理的拒绝,您可以这样做:
this.db = mongo.connectAsync(mongoUrl);
this.db.catch(() => {});
虽然我个人不建议这样做,但您或许应该有重新连接逻辑,如果多次重新连接尝试失败,甚至可能使服务器崩溃。