在JavaScript中使用setTimeout()拒绝promise时出现Uncaught(In Promise)错误

cld4siwp  于 2023-05-27  发布在  Java
关注(0)|答案(3)|浏览(211)

我正在学习JavaScript中的promise,我决定实现一个简单的promise,我将设置一个3秒的超时,然后拒绝promise。在拒绝它时,我捕获错误并将其显示在HTML元素中。promise工作得很好,并显示了消息,但我在控制台中得到了以下错误。

Uncaught (in promise) I hate you
Promise.then (async)        
(anonymous)

下面是代码供大家参考--

const myPromise = new Promise(function(myResolve, reject) {
setTimeout(() => {
    reject('I hate you');
}, 3000);
});

myPromise.then(function(value) {
  document.getElementById("demo").innerHTML = value;
});

myPromise.catch( error => {
    console.log("Catching it");
    document.getElementById("demo").innerHTML = error;
});
<h2>JavaScript Promise</h2>
<p>Wait 3 seconds (3000 milliseconds) for this page to change.</p>
<h1 id="demo"></h1>

请帮我找出我犯的错误。

cfh9epnr

cfh9epnr1#

myPromise.then(function(value) {
  document.getElementById("demo").innerHTML = value;
}).catch( error => {
    console.log("Catching it");
    document.getElementById("demo").innerHTML = error;
});

您需要在.then之后捕获错误

pwuypxnk

pwuypxnk2#

这个应该能用

<html>

<body>

  <h2>JavaScript Promise</h2>

  <p>Wait 3 seconds (3000 milliseconds) for this page to change.</p>

  <h1 id="demo"></h1>

  <script>
    const myPromise = new Promise(function(myResolve, reject) {
      setTimeout(() => {
        reject('I hate you');
      }, 3000);
    });

    myPromise.then(function(value) {
      document.getElementById("demo").innerHTML = value;
    }).catch(error => {
      console.log("Catching it");
      document.getElementById("demo").innerHTML = error;
    });
  </script>

</body>

</html>
dzjeubhm

dzjeubhm3#

更新

感谢tlvi38对已接受答案的评论,我现在理解了我的查询,OP发布的原始问题中未捕获的问题可以通过为未链接的then返回的新promise添加单独的catch块来解决,如下所示:

const myPromise = new Promise(function (myResolve, reject) {
  setTimeout(() => {
    reject("I hate you");
  }, 500);
});

const newUncaughtPromise = myPromise.then(function (value) {
  document.getElementById("demo").innerHTML = value;
});

myPromise.catch((error) => {
  console.log("Catching it");
  document.getElementById("demo").innerHTML = error;
});

newUncaughtPromise.catch((error) => {
  console.log("Catching the uncaught it");
  document.getElementById("demo_uncaught").innerHTML = error;
});

ORIGINAL因为我不能添加评论,我写这作为一个答案,但我观察到,除了接受的答案,如果你只有像下面这样的catch块,它也没有任何问题。

const myPromise = new Promise(function(myResolve, reject) {
  setTimeout(() => {
    reject('I hate you');
  }, 3000);
});
  
myPromise.catch( error => {
  console.log("Catching it");
  document.getElementById("demo").innerHTML = error;
});

但是,如果thencatch两者都没有链接起来,则以任何顺序在控制台中给出Uncaught error..。有人能解释一下为什么吗?

相关问题