Javascript 如何退出函数级联/链?
如果使用返回Javascript 如何退出函数级联/链?,javascript,chaining,Javascript,Chaining,如果使用返回this的函数创建对象,则可以创建以前调用的函数链,并创建函数调用的级联: var i = { foo: function () { // Something here... return this; }, bar: function () { // Something here... return this; } }; i.foo().bar().foo() 但是如果在bar中发生错误,并且在这种情况下我不想调用foo,该怎么办
this
的函数创建对象,则可以创建以前调用的函数链,并创建函数调用的级联:
var i = {
foo: function () {
// Something here...
return this;
},
bar: function () {
// Something here...
return this;
}
};
i.foo().bar().foo()
但是如果在bar
中发生错误,并且在这种情况下我不想调用foo
,该怎么办?我如何打破瀑布
如果可能的话,我希望避免使用
try/catch
语句。可能不是您想要的,但承诺对于链接和错误处理非常有用:
var i={
计数:0,
foo:function(){
//这里有些东西。。。
这个.count++;
console.log('foo');
返回这个。计数<4?
承诺.解决(这个问题):
拒绝(新错误('Count too high!'));
},
条:函数(){
//这里有些东西。。。
这个.count++;
console.log('bar');
返回这个。计数<4?
承诺.解决(这个问题):
拒绝(新错误('Count太高!Count为'+this.Count));
}
};
i、 foo()//首先
.then(i=>i.bar())//秒
.然后(i=>i.foo())//第三个
.then(i=>i.bar())//太多了!
.then(i=>i.whatIsThis())//将不运行
.then(i=>i.whatIsThis())//将不运行
.catch(error=>console.log(error.message))代码>可以返回i的新空实例,然后在出现错误时返回空对象:
class Chainable {
constructor(data){
this.data = data;
}
foo (foo) {
//if an error occured
if(foo == 10) return new Chainable();
// Something here...
return new Chainable(this.data + foo);
},
bar () {
//if were in an error, fail silently
if(!this.data) return this;
// Something here...
return this;
}
}
(new Chainable(1))
.foo(5).bar().bar().data // 6
(new Chainable(1))
.foo(10).bar().bar().data //undefined
好的,一件简单的事情是,如果你想在不使用try/catch
的情况下处理这个问题,你必须在函数中加入if条件,显然你必须返回一些东西,这样你就可以在这个上下文中执行更多的函数,而不是异常。因此,请尝试在对象中创建所有功能,并且仅当有人扩展时才允许执行您的功能逻辑。如果失败,则返回基,否则返回当前对象。在这种情况下,您可以避免每次都创建对象
例如:
让我们考虑一下“<代码> BaseService < /C>”,其中定义了所有的功能,并在它上面加上一层以进一步扩展,因此您可以使用这种模式:
foo: function() {
if(<function foo does not belongs to this>) {
.......
.......
if(<on logical failure>) {
return this.__proto__;
}
.......
.......
}
return this;
}
Ho,您是否通知错误?如果出现故障状态,您还可以让bar
返回一个虚拟对象,而不是this
。该虚拟对象可能包含一些故障信息。(尽管它必须具有可用于i
的所有函数,否则您可能会在尝试调用不存在的函数时遇到异常)。您也可以简单地让i
保持故障状态,并让函数在前一个操作失败的情况下不执行任何操作(或者可能执行其他操作)。发生错误是什么意思?@KoushikChatterjee一个假设性错误,可能包括用户未将数据输入输入输入、数据库未能保存、,所以,逻辑上,不是代码错误,对吗?不,真的不是。承诺只能用于异步结果。一个简单的带有同步异常的try
/catch
语句在这里会容易得多。感谢您的输入。你能给我指一些能更详细解释这一点的资源吗?在我看来,承诺可能有点过头了,但我不认为它不应该被使用有什么不好。除了我的经验之外,没有其他资源:-)承诺的问题不仅仅是它们过头了(OP想要一个比try
/catch
)更简单的解决方案,但是,异步化使得返回不可能。不必要的时候不要这样做。如果您只是喜欢链接,那么许多函数库中的或数据类型可能是更好的选择。