承诺可以在被拒绝后“处理”。也就是说,在提供catch处理程序之前,可以调用promise的拒绝回调函数。这种行为是有点麻烦,因为我可以写...
var promise = new Promise(function(resolve) {
kjjdjf(); // this function does not exist });
......在这种情况下,诺言被拒绝默默。如果忘记添加catch处理程序,代码将继续无提示地运行而没有错误。这可能导致徘徊和难以发现的错误。
在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;
}
在上面的例子中,假设teethPromise被拒绝(错误:出牙膏)getRoomTemperature果然应验了。在这种情况下,会有一个未处理的Promise拒绝,直到等待toothPromise。
我的观点是......如果我们认为未处理的Promise拒绝是一个问题,那么稍后由await处理的Promise可能会无意中报告为错误。再次,如果我们认为未处理的Promise拒绝不成问题,合理的错误可能不会被报告。
有关这方面的想法?
这是关系到Node.js的项目发现这里的讨论:
Default Unhandled Rejection Detection Behavior
如果你这样写代码:
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(当然,根据引擎不同,可能没有任何内容)会有相同的“未处理的拒绝”错误。 (我觉得很奇怪你的函数没有返回任何东西,这意味着你的异步函数产生了未定义的承诺。
如果我现在做一个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);
}
请注意,这应该防止任何未处理的承诺拒绝。
哪里可以更改?我使用离子3时,我打离子cordova构建andorid命令给我这个错误。 –
很难说这个信息。我建议你尽量创造一个最小的复制品,并为你的具体情况创建一个新的问题。 –
我已经打开了它的赏金。请看看它https://stackoverflow.com/q/48145380/5383669 –