Javascript 如果一个函数被拒绝,则拒绝所有函数
我在dialogflow实现中遇到了类似的问题,我需要在Google日历上预订任何约会。如果只有一个函数被拒绝,我将拒绝所有函数Javascript 如果一个函数被拒绝,则拒绝所有函数,javascript,node.js,dialogflow-es,Javascript,Node.js,Dialogflow Es,我在dialogflow实现中遇到了类似的问题,我需要在Google日历上预订任何约会。如果只有一个函数被拒绝,我将拒绝所有函数p1、p2和p3。在下面的代码中,虽然拒绝了p2,但执行了其他p1和p3(我希望所有功能p1,p2和p3) 函数f1(){ 返回承诺。全部([p1(),p2(),p3()])) .然后(值=>{ 警报(“正常”); }) .catch(错误=>{ log('err:'+err); }); } 函数p1(){ 新承诺((解决、拒绝)=>{ 设置超时(解析,1000,警报(
p1
、p2
和p3
。在下面的代码中,虽然拒绝了p2
,但执行了其他p1
和p3
(我希望所有功能p1
,p2
和p3
)
函数f1(){
返回承诺。全部([p1(),p2(),p3()]))
.然后(值=>{
警报(“正常”);
})
.catch(错误=>{
log('err:'+err);
});
}
函数p1(){
新承诺((解决、拒绝)=>{
设置超时(解析,1000,警报(“一”);
});
}
函数p2(){
新承诺((解决、拒绝)=>{
拒绝(“拒绝”);
});
}
函数p3(){
新承诺((解决、拒绝)=>{
设置超时(解析、3000、警报(“三”);
});
}
f1();
它包含了很多实现它的代码,所以我会给出简短的说明
axious
的示例,我们可以使用CancelToken
取消HTTP请求
你到底需要什么还不清楚。如果并行运行函数,则不能拒绝或不执行这些函数。您只能通知内部功能代码取消操作是从外部请求的。我们不知道在异步函数中执行了哪些异步操作 onCancel(一个)
一次(三次)
失败:错误:Oops
问题是您没有从
p1、p2、p3
返回任何内容。因此,当您调用Promise.all([p1(),p2(),p3()])
时,它实际上是使用Promise.all([undefined,undefined,undefined])(无论如何解析)
调用的,它没有拒绝。这就是为什么你没有看到错误
在函数中添加return
函数f1(){
返回承诺。全部([p1(),p2(),p3()]))
.然后(值=>{
警报(“正常”);
})
.catch(错误=>{
log('err:'+err);
});
}
函数p1(){
返回新承诺((解决、拒绝)=>{
设置超时(解析,1000);
});
}
函数p2(){
返回新承诺((解决、拒绝)=>{
拒绝(“拒绝”);
});
}
函数p3(){
返回新承诺((解决、拒绝)=>{
setTimeout(解析,3000);
});
}
f1()代码>您有意并行启动p1()
、p2()
和p3()
。当其中一个失败时,其他函数已经执行,您无法撤消该操作。如果您希望一个接一个地对它们排序,并在前一个失败时中止调用其他函数,则需要完全不同地编写f1()
。那么,您真正希望在这里发生什么呢?Promise。如果其中任何一个承诺失败,则all
将拒绝其中运行的所有承诺。如果拒绝任何元素,则all将被拒绝。例如,如果您传入的承诺在超时后解析,而一个承诺立即拒绝,那么promise.all将立即拒绝。那么,在我的例子中,为什么Promise.all不能拒绝所有函数呢?如果我使用var函数,Promise.all可以正常工作。[link]()嗨@Naren,我尝试添加return,但它一直显示p1和p3的警报。如果p2被拒绝,那么p1和p3就不会被执行。当然,它们肯定会调用,因为你不知道什么时候执行。我肯定会建议您阅读更多关于如何工作的内容。请记住承诺是不可取消的,如果您确实不希望执行其他承诺(在承诺代码内),您可能需要跟踪时间间隔
并在出现错误时清除超时。
import { CPromise } from "c-promise2";
function makePromise(ms, label) {
return new CPromise((resolve, reject, { onCancel }) => {
setTimeout(resolve, ms);
onCancel(() => console.log(`onCancel(${label})`));
});
}
CPromise.all([
makePromise(2000, "one"),
makePromise(1500, "two").then(() => {
throw Error("Oops");
}),
makePromise(4000, "three")
]).then(
(v) => console.log(`Done: ${v}`),
(e) => console.warn(`Fail: ${e}`)
);