Обіцянки можна "впоратися" після їх відхилення. Тобто, ви можете зателефонувати до відхилення виклику обіцянки перед наданням обробника вилову. Така поведінка мене трохи турбує, тому що можна писати ...
var promise = new Promise(function(resolve) {
kjjdjf(); // this function does not exist });
... і в цьому випадку Обіця відкидається мовчки. Якщо ви забудете додати обробник лову, код продовжує мовчки працювати без помилок. Це може призвести до затримок і важко знайти помилок.
У випадку з Node.js йдеться про обробку цих нерегламентованих відхилень Обіцяння та повідомлення про проблеми. Це приводить мене до асинхронізації / очікування 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;
}
У наведеному вище прикладі, припустимо, що зубиPromise були відхилені (Помилка: з зубної пасти!), Перш ніж виконати getRoomTemperature. У цьому випадку буде безрезультатне відхилення обіцянки, поки очікують зубипроміни.
Моя думка в цьому: якщо ми вважатимемо невідправлене відхилення обіцянки проблемою, обіцянки, які згодом розглядаються в очікуванні, можуть ненароком повідомити про помилки. Знову ж таки, якщо ми вважатимемо, що відмови в обігу не врегульовані, не є проблематичними, про законні помилки може не надходити повідомлення.
Думки про це?
Це пов’язано з дискусією, знайденою тут у проекті 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, він синхронно створить остаточну (не повернуту) обіцянку - яка матиме таку саму помилку "необробленого відхилення", як і будь-яка інша обіцянка (звичайно, нічого не може бути, залежно від двигуна). (Я вважаю, що дуже дивно, що ваша функція нічого не повертає, а це означає, що ваша функція асинхронізації дає обіцянку для невизначених.
Якщо я зараз зробіть обіцянку без улову, і додаю її пізніше, більшість реалізацій "помилок непоправленого відхилення" насправді буде відкликати попередження, коли я згодом оброблю його. Іншими словами, асинхронізація / очікування не змінює дискусію про "неспроможне відхилення" жодним чином, який я бачу.
щоб уникнути цієї нерівності, напишіть код таким чином:
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);
}
Зауважте, що це повинно запобігти будь-якому нерозбірливому обіцянню відмови.