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
)更简单的解决方案,但是,异步化使得返回不可能。不必要的时候不要这样做。如果您只是喜欢链接,那么许多函数库中的
数据类型可能是更好的选择。