我试图了解Promise是什么,所以我开始了following this guide。
我从指南中复制了此代码,并在开发人员控制台中对其进行了尝试:
var promise = new Promise(function(resolve, reject) {
// do a thing, possibly async, then…
if (false) {
resolve("Stuff worked!");
}
else {
reject(Error("It broke"));
}
});
我收到一个错误,说Uncaught (in promise) Error: It broke
。我不明白这是什么意思。谁能解释?
答案 0 :(得分:4)
一个承诺可以被解决或被拒绝。如果是/何时解决,则将调用任何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'); })
请注意,该消息是浏览器/ JavaScript引擎的有用警告。您不必遵守已拒绝的承诺,但通常您希望这样做,因此该消息很有帮助。
重要的是要注意诺言如何运作。当您调用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);
}
pre { margin: 0; }
换句话说,then
采用表示call this function if and when you're resolved
的函数,而catch
采用表示call this function if and when you're rejected
的函数。
答案 1 :(得分:4)
这意味着您的Promise抛出了一个未被发现的错误。
即您没有按承诺调用.catch()。
在您的情况下,if(false)永远不会评估为真实,因此您的承诺会被拒绝。