为了完整起见。另一种选择是传递一个对象,该对象将随着链的进展而更新。这将让您在适合您的时候访问结果值(而不必在链的末尾添加它)。
而不是这样的语法:
var result = chainableFunction.doThis().doThat().result;
然后,您将拥有:
chainableFunction.update(variableToUpdate).doThis().doThat();
var result = variableToUpdate.result;
逻辑与其他人提出的解决方案非常相似。使用哪一个可能取决于您的用例。必须用 .result 结束链的一个可能问题是没有什么可以阻止您以这种方式使用它:
var chainedUp = chainableFunction.doThis().doThat();
doSomething(chainedUp.result);
...
chainedUp.doOneMoreThing()
...
doSomething(chainedUp.result); // oups, .result changed!
使用 variableToUpdate 选项,结果值不受未来函数调用的影响。同样,这在某些情况下可能是可取的,而在其他情况下则不然。
下面的完整示例
#!/usr/bin/env node
var ChainUp = {};
(function(Class) {
// Pure functions have no access to state and no side effects
var Pure = {};
Pure.isFunction = function(fn) {
return fn && {}.toString.call(fn) === '[object Function]';
};
Class.instance = function() {
var instance = {};
var result;
var updateRef;
function callBack(fn) {
// returning a clone, not a reference.
if(updateRef) { updateRef.r = (result || []).slice(0); }
if(Pure.isFunction(fn)) { fn(result); }
}
instance.update = function(obj) {
updateRef = obj;
return instance;
};
instance.one = function(cb) {
result = (result || []); result.push("one");
callBack(cb);
return instance;
};
instance.two = function(cb) {
result = (result || []); result.push("two");
callBack(cb);
return instance;
};
instance.three = function(cb) {
result = (result || []); result.push("three");
callBack(cb);
return instance;
};
instance.result = function() {
return result;
};
return instance;
};
}(ChainUp));
var result1 = {};
var chain = ChainUp.instance().update(result1);
var one = chain.one(console.log); // [ 'one' ]
console.log(one.result()); // [ 'one' ]
console.log(result1.r); // [ 'one' ]
var oneTwo = chain.two();
console.log(oneTwo.result()); // [ 'one', 'two' ]
console.log(result1.r); // [ 'one', 'two' ]
var result2 = {};
var oneTwoThree = chain.update(result2).three();
console.log(oneTwoThree.result()); // [ 'one', 'two', 'three' ]
console.log(result2.r); // [ 'one', 'two', 'three' ]
console.log(result1.r); // [ 'one', 'two' ]
笔记。类和实例关键字可能不熟悉。这是我在使用闭包而不是原型继承从原型构造实例时使用的约定。您可以用 self 替换实例(并且 self = this 而不是 instance = {})..