Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/412.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如果一个函数被拒绝,则拒绝所有函数_Javascript_Node.js_Dialogflow Es - Fatal编程技术网

Javascript 如果一个函数被拒绝,则拒绝所有函数

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,警报(

我在dialogflow实现中遇到了类似的问题,我需要在Google日历上预订任何约会。如果只有一个函数被拒绝,我将拒绝所有函数
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}`)
    );