未捕获(承诺)是什么意思?

Joh*_*ohn 12 javascript promise

我正在尝试了解 Promise 是什么,所以我开始遵循本指南

\n\n

我从指南中复制了这段代码,并在我的开发者控制台中进行了尝试:

\n\n
var promise = new Promise(function(resolve, reject) {\n  // do a thing, possibly async, then\xe2\x80\xa6\n\n  if (false) {\n    resolve("Stuff worked!");\n  }\n  else {\n    reject(Error("It broke"));\n  }\n});\n
Run Code Online (Sandbox Code Playgroud)\n\n

我收到一条错误消息说Uncaught (in promise) Error: It broke. 我不明白这是什么意思。谁能解释一下吗?

\n

gma*_*man 14

承诺可以被解决或拒绝。如果是如果/当它被解析时,任何then函数都会被调用。如果被拒绝,catch将调用任何函数。如果您不提供任何catch函数,那么 Promise 可能会有助于打印该警告。

function test(fail) {
  return new Promise((resolve, reject) => {
    if (fail) {
      reject();
    } else {
      resolve();
    }
  });
}

// will print rejected 1
test(true)
  .then(() => { console.log('resolved 1'); })
  .catch(() => { console.log('rejected 1'); })

// might generate the error telling you the promise
// was rejected but you didn't provide a catch function
test(true)
  .then(() => { console.log('resolved 2'); })
Run Code Online (Sandbox Code Playgroud)

请注意,该消息是浏览器/JavaScript 引擎发出的有用警告。您不必捕获被拒绝的承诺,但通常您希望这样做,因此该消息很有帮助。

细节

重要的是要注意 Promise 如何发挥作用。当您调用时,then(someFunc)它们实际上会列出someFunc稍后要调用的函数列表。如果承诺已经履行,他们将调用列表中的每个函数并清除列表。如果承诺没有兑现,他们将什么都不做,直到兑现为止。catch除了它是一个不同的列表之外,其他都是相同的。

这是一个例子

function makePromiseParts() {
  let resolve;
  let reject;
  const promise = new Promise((_resolve, _reject) => {
    log('--in promise--');
    resolve = _resolve;
    reject = _reject;
  });
  return {
    promise,
    resolve,
    reject,
  };
}

function wait() {
  return new Promise(resolve => setTimeout(resolve));
}

async function main() {
  {
    log('--start--');
    
    const p = makePromiseParts();
    
    log('--after make promise--');

    p.promise.then(() => { log('then 1'); });
    p.promise.then(() => { log('then 2'); });

    log('--before resolve--');

    p.resolve();

    log('--after resolve--');
    
    await wait();

    log('--after waiting--');

    p.promise.then(() => { log('then 3'); });
    p.promise.then(() => { log('then 4'); });

    log('--before waiting--');
    
    await wait();

    log('--end--');
  }
  
  await wait();
  log(' ');

  {
    log('--start--');
  
    const p = makePromiseParts();

    log('--after make promise--');

    p.promise.catch(() => { log('catch 1'); });
    p.promise.catch(() => { log('catch 2'); });

    log('--before reject--');

    p.reject();

    log('--after reject--');
    
    await wait();

    log('--after waiting--');

    p.promise.catch(() => { log('catch 3'); });
    p.promise.catch(() => { log('catch 4'); });

    log('--before waiting--');
    
    await wait();

    log('--end--');
  }

}
main();

function log(...args) {
  const elem = document.createElement('pre');
  elem.textContent = [...args].join(' ');
  document.body.appendChild(elem);
}
Run Code Online (Sandbox Code Playgroud)
pre { margin: 0; }
Run Code Online (Sandbox Code Playgroud)

换句话说,then接受一个表示 的函数call this function if and when you're resolved,并catch接受一个表示 的函数call this function if and when you're rejected


Gab*_*ely 5

这意味着你的 Promise 抛出了一个未被捕获的错误。

即你没有按照你的承诺调用 .catch() 。

在你的情况下, if(false) 永远不会评估为 true,所以你的承诺被拒绝。