2017-04-24 10 views
1

と仮定します。私はlogという関数を用意しています。JavaScript:任意の順序で連鎖メソッドを実行

これらの機能の両方が機能するように私のコードをリファクタリングすることはできますか?

log("needsChange").doSomethingWithTheStringBeforePrintingIt(); 
log("perfectStringToPrint"); 
+0

ことは、この問題を解決するためのライブラリを作ってきました。 – Shilly

+0

@ Shillyはい、問題は、文字列がすでに印刷されているため、何かをするのが遅れることです。 – omidh

+0

文字列を印刷する前にすべての編集を行う必要があります。エミールの答えは、これがどのようにできるかをあなたに示しました。文字列が 'perfectStringToPrint'であるかどうかを検出する方法がある場合、 'needsChange'が完全ではないと検出された場合、実際のconsole.log呼び出しを 'doSomethingWithTheStringBeforePrintingIt'に移動することによってこの正確な構文を取得することは可能です。 – Shilly

答えて

2

あなたは、ネストされたクラスのロジックと似たような行うことができます。

var logger = (function() { 
 
    //Class 
 
    var _log = (function() { 
 
    function _log(message) { 
 
     var _this = this; 
 
     this.message = message; 
 
     this.promise = null; 
 
     this.promises = []; 
 
     this.promise = Promise.all(this.promises).then(function(values) { 
 
     console.log(_this.message); // [3, 1337, "foo"] 
 
     }); 
 
    } 
 
    _log.prototype.reverse = function() { 
 
     var self = this; 
 
     this.promises.push(new Promise(function(resolve, reject) { 
 
     setTimeout(resolve, 0, (function() { 
 
      self.message = self.message.split("").reverse().join(""); 
 
     })()); 
 
     })); 
 
     return this; 
 
    }; 
 
    _log.prototype.capitalizeFirst = function() { 
 
     var self = this; 
 
     this.promises.push(new Promise(function(resolve, reject) { 
 
     setTimeout(resolve, 0, (function() { 
 
      self.message = self.message[0].toUpperCase() + self.message.substr(1); 
 
     })()); 
 
     })); 
 
     return this; 
 
    }; 
 
    return _log; 
 
    }()); 
 
    //Instancer function 
 
    return function log(message) { 
 
    //Return instance of class 
 
    return new _log(message); 
 
    }; 
 
})(); 
 
//Test 
 
logger("needsChange").reverse().capitalizeFirst().reverse(); //Capitalizes last letter 
 
logger("perfectStringToPrint");
:あなたは約束に慣れている場合、あなたはこのような何かを行うことができます

var log = (function() { 
 
    //Class 
 
    var _log = (function() { 
 
    function _log(message) { 
 
     this.message = message; 
 
    } 
 
    _log.prototype.doSomethingWithTheStringBeforePrintingIt = function() { 
 
     this.message = this.message.split("").reverse().join(""); 
 
     return this; 
 
    }; 
 
    _log.prototype.capitalizeFirstWord = function() { 
 
     this.message = this.message[0].toUpperCase() + this.message.substr(1); 
 
     return this; 
 
    }; 
 
    _log.prototype.print = function() { 
 
     return this.message; 
 
    }; 
 
    return _log; 
 
    }()); 
 
    //Instancer function 
 
    return function log(message) { 
 
    //Return instance of class 
 
    return new _log(message); 
 
    }; 
 
})(); 
 
//Test 
 
console.log(log("needsChange") 
 
    .doSomethingWithTheStringBeforePrintingIt() 
 
    .capitalizeFirstWord() 
 
    .print(), log("perfectStringToPrint") 
 
    .print());

これにより、.printコールが不要になります。