【发布时间】:2017-06-01 11:00:09
【问题描述】:
我想承诺一个 ODM/ORM。在拥有find()、insert()、update()等其他方法的同时,您将如何实现promise接口。所以你可以这样做
var Users = Collection('users')
Users.find({name: 'joe'})
.then(users => users.update({name: 'jim'))
.then(console.log)
我正在考虑从Promise 继承,但是您如何自定义 then() 以返回您的 ORM 实例,以确保我们正在使用按顺序进行的所有查询的实例。
现在我正在使用组合,但是我必须代理每个变得丑陋的方法调用。
例如:
var Promise = require('bluebird')
var Collection = function(Storage, name) {
this.promise = new Promise(function(resolve, reject) {
self.resolve = resolve
self.reject = reject
})
}
Collection.prototype.find = function(query) {
// async query stuff here
Storage.doAsyncQueryStuff(function (err, results) {
err && this.reject(err)
this.resolve(results)
})
}
Collection.prototype.then = function(callback) {
var self = this
this.promise.then(function() {
callback && callback.apply(self, arguments)
})
return this
}
我想做的是:
var inherits = require('util').inherits
var Promise = require('bluebird')
var Collection = function(Storage, name) {
var self = this
// error here
Promise.call(
this,
function(resolve, reject) {
self.resolve = resolve
self.reject = reject
})
}
inherits(Collection, Promise)
我似乎无法初始化 Promise。还是我应该以不同的方式做这件事?
【问题讨论】:
-
I want to promisify- 我认为蓝鸟promisify方法不合适? bluebirdjs.com/docs/api/promise.promisify.html 或 bluebirdjs.com/docs/api/promise.promisifyall.html -
promisify 和 promisifyAll 将使函数返回一个 Promise 实例。我需要一个继承返回的 promise 方法的 ODM 实例,这样我就可以将更多的 ODM 方法链接到 Promise。例如:Users.insert(...).catch(...).delete(...).then()。使用 Promisify,一旦执行 then() 或 catch() 就不能调用另一个 ODM 方法。
-
我不明白您为什么希望
Collection继承自Promise。你什么时候/为了什么使用Users.then(??? => { … })?Collection应该是一个普通的类,每个find/insert/update方法应该为其各自的结果返回一个承诺。不是新系列。 -
使集合正常工作并保持状态 - 不可变或其他。然后你可以让它更像 FP 并控制数据流。例如。
Users.create().then(log).catch(retryAfterAWhile).insert()而不是Users.create().then(state => Users.insert())。但你是对的,我可能想多了。我基本上在寻找类似 highland.js 的东西,但寻找的是 ODM 和像 Promise 这样的规范接口。我是不是误解了 Promise?
标签: javascript promise bluebird odm