Javascript 为什么承诺链在本例中可以工作,而不会抛出错误

Javascript 为什么承诺链在本例中可以工作,而不会抛出错误,javascript,Javascript,因此,在第一个示例中,链一直执行到最后一个console.log,没有错误,但在第二个示例中(类似),它会出错。为什么会发生这种情况?我是否可以让第一个示例也抛出一个错误 我只知道这与向对象添加函数有关,因为如果测试未定义,链就会断开,但我无法理解访问对象中不存在的键如何不会导致错误 编辑:我刚刚意识到我的大脑放屁。自然访问test.something会返回未定义而不是错误 //例1:怪异 var检验={}; test.f1=函数结果{ 返回新的允诺函数解析、拒绝{ console.logres

因此,在第一个示例中,链一直执行到最后一个console.log,没有错误,但在第二个示例中(类似),它会出错。为什么会发生这种情况?我是否可以让第一个示例也抛出一个错误

我只知道这与向对象添加函数有关,因为如果测试未定义,链就会断开,但我无法理解访问对象中不存在的键如何不会导致错误

编辑:我刚刚意识到我的大脑放屁。自然访问test.something会返回未定义而不是错误

//例1:怪异 var检验={}; test.f1=函数结果{ 返回新的允诺函数解析、拒绝{ console.logresult,result; 决议1 }; } test.f2=函数结果{ 返回新的允诺函数解析、拒绝{ console.logresult,result; 决议2 }; } test.f3=函数结果{ 返回新的允诺函数解析、拒绝{ console.logresult,result; 决议3 }; } test.f4=函数结果{ console.logresult,result; } 测试1.f11 .thenstest.f2 .thenstest.f3 .然后测试.应该引起错误 .thenstest.f4 //例2:如预期的那样 新的允诺人决定、拒绝{ 决议1; } .Then函数结果{ 返回新的允诺函数解析、拒绝{ 决议2 }; } .Then函数结果{ 返回新的允诺函数解析、拒绝{ 决议3 }; } .那么应该是肇事者吗 .Then函数结果{ 控制台。日志结果:,结果; }; 。然后最多接受两个参数。第一个参数(如果存在)在上一个承诺已解决时运行。第二个参数(如果存在)在上限承诺被拒绝时运行

允许将undefined作为第一个参数或同时作为两个参数传递给.then-因为不存在任何参数,所以上面的承诺将通过.then传递,而不改变

另外,.thenundefined,fn相当于.catchfn

那么,你的

.then(test.shouldCauseError)
未定义的传递到。然后,这意味着上面的承诺将通过。然后不进行修改和抛出-它将传递到下一个。然后在链中,就好像.thentest.shouldCauseError不存在一样

由于将undefined传递给.then是完全正确的,因此您需要其他方法来创建错误-可能会将传递给.then的所有内容包装到一个函数中,该函数将检查传递的表达式是否确实是函数,如果不是,则返回一个抛出以下内容的函数:

.then(validate(test.shouldCauseError))
//例1:怪异 var检验={}; test.f1=函数结果{ 返回新的允诺函数解析、拒绝{ console.logresult,result; 决议1 }; } test.f2=函数结果{ 返回新的允诺函数解析、拒绝{ console.logresult,result; 决议2 }; } test.f3=函数结果{ 返回新的允诺函数解析、拒绝{ console.logresult,result; 决议3 }; } test.f4=函数结果{ console.logresult,result; } const validate=arg=>{ 如果参数的类型!=“函数”{ 返回=>{ 抛出新的错误; } } 返回arg; }; 测试1.f11 .thenvalidatetest.f2 .thenvalidatetest.f3 。然后验证测试。应导致错误 .thenvalidatetest.f4 .catcherr=>{ console.log“错误捕获”; }; 。然后最多接受两个参数。第一个参数(如果存在)在上一个承诺已解决时运行。第二个参数(如果存在)在上限承诺被拒绝时运行

允许将undefined作为第一个参数或同时作为两个参数传递给.then-因为不存在任何参数,所以上面的承诺将通过.then传递,而不改变

另外,.thenundefined,fn相当于.catchfn

那么,你的

.then(test.shouldCauseError)
未定义的传递到。然后,这意味着上面的承诺将通过。然后不进行修改和抛出-它将传递到下一个。然后在链中,就好像.thentest.shouldCauseError不存在一样

由于将undefined传递给.then是完全正确的,因此您需要其他方法来创建错误-可能会将传递给.then的所有内容包装到一个函数中,该函数将检查传递的表达式是否确实是函数,如果不是,则返回一个抛出以下内容的函数:

.then(validate(test.shouldCauseError))
//例1:怪异 var检验={}; test.f1=函数结果{ 返回新的允诺函数解析、拒绝{ console.logresult,result; 决议1 }; } test.f2=函数结果{ 返回新的允诺函数解析、拒绝{ console.logresult,result; 决议2 }; } test.f3=函数结果{ 返回新的允诺函数解析、拒绝{ console.logresult,result; 决议3 }; } test.f4=函数结果{ console.logresult,result; } const validate=arg=>{ 如果参数的类型!=“函数”{ 返回=>{ 抛出新的错误; } } 返回arg; }; 测试1.f11 .thenvalidatetest.f2 .thenvalidatetest.f3 。然后验证测试。应导致错误 那么有效吗 atetest.f4 .catcherr=>{ console.log“错误捕获”; }; 在.then侦听器中,两个参数都是可选的。也就是说,以下内容完全有效:

Promise.resolve.then//没有传递任何信息 这和你写的一样:

Promise.resolve.then未定义,未定义 由于访问对象的不存在属性返回未定义,因此

.然后测试.应该引起错误 …基本上与…相同

.Then未定义 …而且它不会扔

然而,在第二种情况下,它确实抛出了一个ReferenceError,但是它与。然后:访问一个不存在的变量抛出了一个ReferenceError

因此,以下内容也会引发:

应该是肇事者吗 …在shouldCauseError的值甚至可以传递给.then之前,在.then侦听器中,这两个参数都是可选的。也就是说,以下内容完全有效:

Promise.resolve.then//没有传递任何信息 这和你写的一样:

Promise.resolve.then未定义,未定义 由于访问对象的不存在属性返回未定义,因此

.然后测试.应该引起错误 …基本上与…相同

.Then未定义 …而且它不会扔

然而,在第二种情况下,它确实抛出了一个ReferenceError,但是它与。然后:访问一个不存在的变量抛出了一个ReferenceError

因此,以下内容也会引发:

应该是肇事者吗
…before shouldCauseError的值甚至可以传递给。然后

如果将函数以外的任何内容传递给。那么,它将被忽略-原因是。然后可以预期onResolved和onRejected回调,因此,将函数以外的内容传递给onResolved将被忽略。。。这就是promise/A+规范的指定方式,因为原始规范中没有.catch。catchfn只是.thennull,fn,如果您将函数以外的任何内容传递给。那么,它将被忽略-原因是.then可以预期onResolved和onRejected回调,因此,将函数以外的内容传递给onResolved将被忽略。。。这就是promise/A+规范的指定方式,因为原始规范中没有.catch。catchfn只是。然后为null,fn接受您的答案,因为验证。。。方法对我来说是一个很好的解决问题的方法。接受你的答案,因为验证。。。方法对我来说是解决这个问题的好办法。