Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.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 Promise未捕获异步函数引发的错误_Javascript_Node.js - Fatal编程技术网

Javascript Promise未捕获异步函数引发的错误

Javascript Promise未捕获异步函数引发的错误,javascript,node.js,Javascript,Node.js,下面的代码实际上应该捕获异步函数抛出的错误,但它显示的是已解决的then块 常数{ 弗雷奇 }=requirelodash; 异步函数testnum{ 等待异步=> 设置超时=>{ 如果num==11{ 抛出“错误”; } }, 1000; 返回num; } test11.then=> console.logResolved .catch=> console.logRejected ; 因为你没有回报承诺 异步函数testnum{ 返回新的PromiseSolve,拒绝=>{ 设置超时=>{

下面的代码实际上应该捕获异步函数抛出的错误,但它显示的是已解决的then块

常数{ 弗雷奇 }=requirelodash; 异步函数testnum{ 等待异步=> 设置超时=>{ 如果num==11{ 抛出“错误”; } }, 1000; 返回num; } test11.then=> console.logResolved .catch=> console.logRejected
; 因为你没有回报承诺

异步函数testnum{ 返回新的PromiseSolve,拒绝=>{ 设置超时=>{ 如果num==11拒绝错误 resolvenum; }, 1000 }; } test11.then=> console.logResolved .catch=> console.logRejected ;
因为你没有回报承诺

异步函数testnum{ 返回新的PromiseSolve,拒绝=>{ 设置超时=>{ 如果num==11拒绝错误 resolvenum; }, 1000 }; } test11.then=> console.logResolved .catch=> console.logRejected ;
我认为,更直接的方法是坚持承诺

函数testnum{ 返回新的PromiseSolve,拒绝=>{ 设置超时=>{ 如果num==11{ rejectnew错误'Rejected!'; }否则{ resolvenum; } }, 1000; }; } 如果设置为async/await,一种可能的方法可以是以下方法,如中所建议的

功能超时{ 返回新PromiseSolve=>setTimeoutresolve,毫秒; } 异步函数testnum{ 等待超时1000; 如果num==11{ 抛出新错误“已拒绝!”; }否则{ 返回num; } }
我认为,更直接的方法是坚持承诺

函数testnum{ 返回新的PromiseSolve,拒绝=>{ 设置超时=>{ 如果num==11{ rejectnew错误'Rejected!'; }否则{ resolvenum; } }, 1000; }; } 如果设置为async/await,一种可能的方法可以是以下方法,如中所建议的

功能超时{ 返回新PromiseSolve=>setTimeoutresolve,毫秒; } 异步函数testnum{ 等待超时1000; 如果num==11{ 抛出新错误“已拒绝!”; }否则{ 返回num; } }
这是因为setTimeout是同步函数。 是的,setTimeout添加了一些异步执行的代码,但是setTimeout本身是在主线程上同步执行的

因此,您的

async() =>
    setTimeout(() => {
      if (num == 11) {
        throw 'err';
      }
    }, 1000))()

立即同步完成,完成后会触发,仅在一秒钟后,才会抛出错误,这是因为setTimeout是同步函数。 是的,setTimeout添加了一些异步执行的代码,但是setTimeout本身是在主线程上同步执行的

因此,您的

async() =>
    setTimeout(() => {
      if (num == 11) {
        throw 'err';
      }
    }, 1000))()

立即同步完成,完成后,您的then被触发,仅在一秒钟后,抛出错误

异步函数本身不返回承诺吗?另外,如果我将reject'err'更改为在代码中抛出'err',那么它仍然不会被注意到异步函数本身不返回承诺吗?此外,如果我将reject'err'更改为在代码中抛出'err',那么它仍然不会被注意到。它实际上应该在那里等待,直到任务完成,然后才应该返回。在此之前,我使用了wait关键字。有什么我遗漏的吗?setTimeout不返回承诺,所以Wait对它没有影响,其他答案显示了如何将其转换为承诺api。谢谢,我现在已经理解了这个概念。它实际上应该在那里等待,直到任务完成,然后才应该返回。在此之前,我使用了wait关键字。有什么我遗漏的吗?setTimeout不返回承诺,所以Wait对它没有影响,其他答案已经说明了如何将其转换为承诺api。谢谢,我现在已经理解了这个概念。