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