如何使模块模式各自成为一个承诺?

时间:2017-02-28 06:42:15

标签: javascript angularjs design-patterns module promise

我使用Angular 1.5并且我创建了一个工厂函数,它返回一个像这样的文字对象:

return {
   item: null,
   get: function() {
     return item;
   },
   create: function() {
     if (this.get()){
         this.remove();
     }

     this.item = {};
   },
   remove: function() {
     var item = this.get();
     if (item) {
      this.item = null;
     }
   },
   add: function() {
     if (!this.get()) {
        this.create();
     }

     this.item.newprop = 'value';
   }
}
  1. 请不要让我换成功能声明。我想要一个具有自己的动作(函数)和正在处理的属性的对象。

  2. 此模式(如get内的create等等......)我没有从任何地方复制过。所以我想知道是否有名字?这是处理功能黑盒的最佳方法吗?

  3. 将Promise放入内部的最佳方法是什么?所以每个函数都应该返回一个承诺

  4. 我需要使用的每个then函数bind ???

    像这样:

  5. create: function () {
        this.get()
            .then(remove)
            .then(function () {
                this.item = {}; // BUT this === undefined!!
            });
    }
    

1 个答案:

答案 0 :(得分:0)

你必须在每个回调函数中使用bind:

var myModule = {
    item: null,
    get: function() {              
        return Promise.resolve(this.item);
    },
    create: function() {
        return this.remove().then(function() {
            this.item = {};
        }.bind(this));
    },
    remove: function() {
        return this.get().then(function(item) {
            if (item) {
                this.item = null;
            }
        }.bind(this));              
    },
    add: function() {
        return this.get().then(function(item) {
            return item || this.create();
        }.bind(this)).then(function() {
            this.item.newprop = 'value';
        }.bind(this));
    }
}                   
// Let see it working:
myModule.create().then(function() {
    return myModule.get();
}).then(function(item) {
    console.log("After create: ", item);
    return myModule.remove();
}).then(function() {
    return myModule.get();
}).then(function(item) {
    console.log("After remove: ", item);
    return myModule.add();
}).then(function() {
    return myModule.get();
}).then(function(item) {
    console.log("After add: ", item);
});