Обещания могут быть «обработаны» после того, как они отклонены. То есть перед вызовом обработчика можно вызвать обратный вызов отклонения обещания. Это поведение немного надоедает мне, потому что можно написать ...
var promise = new Promise(function(resolve) {
kjjdjf(); // this function does not exist });
... и в этом случае Обещание молча отклоняется. Если кто-то забудет добавить обработчик перехвата, код продолжит работать без ошибок. Это может привести к затяжным и труднодоступным ошибкам.
В случае Node.js идет речь об обработке этих необработанных отклонений Promise и сообщении о проблемах. Это подводит меня к ES7 async / await. Рассмотрим этот пример:
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;
}
В приведенном выше примере, предположим, что toothPromise было отклонено (Ошибка: из зубной пасты!) До выполнения getRoomTempera. В этом случае произойдет необоснованное отклонение Обещания, пока не будут ожидать зубы обещания.
Моя точка зрения такова ... если мы считаем необработанные отказы от обещаний проблемой, то обещания, которые позже обрабатываются ожидающим, могут непреднамеренно сообщаться как ошибки. С другой стороны, если мы считаем, что необоснованные отклонения 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, он синхронно создает окончательное (не возвращаемое) обещание, которое будет иметь такую же ошибку «необработанного отклонения», как и любое другое обещание (конечно, в зависимости от движка может быть ничем). (Я нахожу очень странным, что ваша функция ничего не возвращает, а это означает, что ваша асинхронная функция дает обещание для undefined.
Если я сделаю Обещание прямо сейчас без уловки и добавлю его позже, большинство реализаций «необработанная ошибка отклонения» фактически отзовет предупреждение, когда я сделаю это позже. Другими словами, async / await никоим образом не изменяет обсуждение «необработанного отказа».
чтобы избежать этой ошибки, пожалуйста, напишите код следующим образом:
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);
}
Обратите внимание, что это должно предотвратить любое необоснованное отклонение обещания.