承诺被拒绝后可以“处理”。也就是说,可以在提供catch处理程序之前调用promise的拒绝回调。这种行为对我来说有点麻烦,因为一个人可以写...
var promise = new Promise(function(resolve) {
kjjdjf(); // this function does not exist });
...在这种情况下,Promise被无声拒绝。如果忘记添加捕获处理程序,代码将继续以无提示的方式静默运行。这可能会导致挥之不去的错误。
对于Node.js,讨论了处理这些未处理的Promise拒绝并报告问题。这使我进入了ES7异步/等待状态。考虑以下示例:
async function getReadyForBed() {
let teethPromise = brushTeeth();
let tempPromise = getRoomTemperature();
// Change clothes based on room temperature
let temp = await tempPromise;
// Assume `changeClothes` also returns a Promise
if(temp > 20) {
await changeClothes("warm");
} else {
await changeClothes("cold");
}
await teethPromise;
}
在上面的示例中,假设在实现getRoomTemperature之前,ethnPromise被拒绝(错误:牙膏用完!)。在这种情况下,将有未处理的Promise拒绝,直到等待牙齿Promise。
我的意思是……如果我们认为未处理的Promise拒绝是一个问题,那么稍后由await处理的Promise可能会无意中被报告为bug。再者,如果我们认为未处理的Promise拒绝不成问题,则可能不会报告合法的错误。
有这个想法吗?
这与Node.js项目中的讨论相关:
默认的未处理拒绝检测行为
如果您以这种方式编写代码:
function getReadyForBed() {
let teethPromise = brushTeeth();
let tempPromise = getRoomTemperature();
// Change clothes based on room temperature
return Promise.resolve(tempPromise)
.then(temp => {
// Assume `changeClothes` also returns a Promise
if (temp > 20) {
return Promise.resolve(changeClothes("warm"));
} else {
return Promise.resolve(changeClothes("cold"));
}
})
.then(teethPromise)
.then(Promise.resolve()); // since the async function returns nothing, ensure it's a resolved promise for `undefined`, unless it's previously rejected
}
调用getReadyForBed时,它将同步创建最终(未返回)的Promise-与其他Promise一样,将出现相同的“未处理的拒绝”错误(当然,根据引擎的不同,可能没有任何错误)。(我发现很奇怪,您的函数没有返回任何内容,这意味着您的异步函数会产生未定义的承诺。
如果我立即做出承诺,而以后又添加一个,那么大多数“未处理的拒绝错误”实现实际上都会在以后处理警告时撤回警告。换句话说,异步/等待不会以我所看到的任何方式改变“未处理的拒绝”讨论。
为了避免这种陷阱,请以这种方式编写代码:
async function getReadyForBed() {
let teethPromise = brushTeeth();
let tempPromise = getRoomTemperature();
// Change clothes based on room temperature
var clothesPromise = tempPromise.then(function(temp) {
// Assume `changeClothes` also returns a Promise
if(temp > 20) {
return changeClothes("warm");
} else {
return changeClothes("cold");
}
});
/* Note that clothesPromise resolves to the result of `changeClothes`
due to Promise "chaining" magic. */
// Combine promises and await them both
await Promise.all(teethPromise, clothesPromise);
}
请注意,这应防止任何未处理的承诺被拒绝。