带callback的链类方法?

在Node.js中,如何将类方法链接到一起,最好使用callback函数?

在我的PHP日子里,我通常会做这样的事情:

class MyClass { function get() { // fetch some data from an API endpoint return this; } function set(property, value) { // Set the property to some value on the object return this; } function save() { // Save the data to database return this; } } $myObject = new MyClass(); $myObject->set('something','taco')->save(); 

这种非常常见的面向对象方法允许您将方法连接在一起。

在使用Node.js的时候,你还能以某种方式做类似的链接吗? 或者你只是在callback地狱? 每一个“链”是一个嵌套的callback?

或者我只需要将我的脚本包装在Promise中?

 new Promise(function(resolve, reject){ var myObject = new MyClass(); myObject.set('something','taco'); resolve(myObject); }).then(function(myObject){ myObject.save(); }); 

那是你应该怎么做的? 有什么办法可以把这个更深入地融入到我的课堂中,所以我不必每次都把它包装在承诺中。 我已经看到一些图书馆有一个类似https://github.com/sindresorhus/got的“承诺模式”,但在看了代码后,我仍然不确定他们是如何做到的。

你链接使用return this同步调用。

您使用Promise或callback来链接asynchronous调用。

 class MyClass { get() { return new Promise((resolve, reject)=> { // Make Request and call resolve( result ) or reject( err ) }); } set( property, value ) { this[property] = value; return this; } save() { return new Promise((resolve, reject)=> { // Make Request and call resolve( result ) or reject( err ) }); } } var myObject = new MyClass(); myObject .set('something', 'taco') .save() // resolve handler .then(( saveResult )=> { console.log( saveResult ); return myObject.get(); }) // resolve handler .then(( getResult )=> { console.log( getResult ); }) // reject handler .catch(( error )=> { }); 

你可以存储一个特殊的私有成员variables__lastPromise 。 最初它会被默认解决。 但是,任何执行任务的函数都会使用返回许诺进行更新。 并且该函数本身也只会在前一次存储的promise已经解决之后才能完成任务。

喜欢这个:

 save() { // only after __lastPromise has resolved var newPromise = __lastPromise.then(function() { // Do stuff here }); // update __lastPromise with the newly returned promise this.__lastPromise = newPromise; // return this for regular chaining return this; } 

完整的课程:

 class MyClass { constructor(){ this.__lastPromise = Promise.resolve(); this.a = 0; } set(property, value) { var self = this; self.__lastPromise = self.__lastPromise.then(function() { return new Promise(function(resolve, reject) { console.log('self.%s set to: ', property, value); self[property] = value; resolve(); }); }); return self; } save() { var self = this; self.__lastPromise = self.__lastPromise.then(function() { return new Promise(function(resolve, reject) { console.log('Saved'); resolve(); }); }); return self; } } var myObject = new MyClass(); myObject.set('a', '1').save().set('a', '2').save(); 
 this.a set to: 1 Saved this.a set to: 2 Saved