Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/433.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在ORM中实现(继承)承诺接口_Javascript_Promise_Bluebird_Odm - Fatal编程技术网

Javascript 在ORM中实现(继承)承诺接口

Javascript 在ORM中实现(继承)承诺接口,javascript,promise,bluebird,odm,Javascript,Promise,Bluebird,Odm,我想承诺一个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实例,以确保我们使用的是按顺序进行的所有查

我想承诺一个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 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)

我似乎无法得到初始化的承诺。或者我应该用另一种方式来做

经过一番研究,我发现在ORM实例中继承承诺不是一个好主意,因为:

承诺递归解析,每个承诺返回一个从上一个承诺解析的
新承诺

例如:

允诺人1将首先解决允诺人2,并将解决后的价值用作允诺人1的解决价值。然后,允诺人1将返还一份新的允诺(允诺人3),该允诺的价值为允诺人1

这一点很重要,因为承诺解析状态是不可变的,但承诺是可链接的

要有效地为ODM中的每个then()调用返回新的承诺,同时保留其当前状态,需要进行优化,例如使ORM状态数据不可变或从全局存储(注册表)引用,同时保持其当前的
查询
唯一(过滤器、排序、加载的关系)等等,在ORM上编写像then()、catch()这样的promise接口更简单,因为promise规范非常宽容

阻止通过继承扩展bluebird,因为存在一个只允许Promise类型的对象创建实例的检查。

Bluebird以及FF、Chrome和Node.js中内置的Promise不能通过ES5继承进行扩展。它们都需要和Promise的实例来实例化

ECMA262定义可继承的承诺对象。

使用ES6类语法,您可以扩展内置浏览器承诺

class MyPromise extends Promise {} 
这可以在Node.js上使用Babel

通过直接在ES5中设置
\uuu proto\uu
属性,可以扩展bluebird和内置promise

/**
 * @class   MyPromise
 * @extends Promise
 */
var MyPromise = function () {
  var resolve, reject
  var promise = new Promise(function(_resolve, _reject) {
      resolve = _resolve
      reject = _reject
    })
  promise.__proto__ = this.__proto__
  promise.resolve = resolve
  promise.reject = reject
  return promise
}

MyPromise.prototype = Object.create(Promise.prototype, { constructor: { value: MyPromise } })

MyPromise.prototype.call = function() {
    this.resolve(new Date)
}

MyPromise.all = Promise.all
MyPromise.cast = Promise.cast
MyPromise.reject = Promise.reject
MyPromise.resolve = Promise.resolve

module.exports = MyPromise

虽然我不推荐它,因为
\uuuu proto\uuu
虽然得到广泛支持,但它不是标准的

我想promisify
-我认为蓝鸟
promisify
方法不合适?或者promisify和promisifyAll将使函数返回一个承诺实例。我需要一个ODM实例来继承返回的promise方法,这样我就可以将更多的ODM方法链接到promise。例如:Users.insert(…).catch(…).delete(…).then()。使用promisify,一旦执行了then()或catch(),就不能调用另一个ODM方法。我不明白您为什么希望
Collection
Promise
继承。什么时候/为了什么你会使用一些
用户。然后(???=>{…})
Collection
应该是一个普通类,每个
find
/
insert
/
update
方法都应该为其各自的结果返回承诺。不是新集合。要使集合正常运行并保留状态,请执行以下操作-不可变或其他操作。然后您可以使它更像FP并控制数据流。例如,
Users.create().then(log).catch(稍后重试).insert()
而不是
Users.create().then(state=>Users.insert())
。但你是对的,我可能想得太多了。我基本上是在寻找像highland.js这样的东西,但需要一个ODM和一个像Promise这样的规范接口。我是不是误解了承诺?
class MyPromise extends Promise {} 
/**
 * @class   MyPromise
 * @extends Promise
 */
var MyPromise = function () {
  var resolve, reject
  var promise = new Promise(function(_resolve, _reject) {
      resolve = _resolve
      reject = _reject
    })
  promise.__proto__ = this.__proto__
  promise.resolve = resolve
  promise.reject = reject
  return promise
}

MyPromise.prototype = Object.create(Promise.prototype, { constructor: { value: MyPromise } })

MyPromise.prototype.call = function() {
    this.resolve(new Date)
}

MyPromise.all = Promise.all
MyPromise.cast = Promise.cast
MyPromise.reject = Promise.reject
MyPromise.resolve = Promise.resolve

module.exports = MyPromise