Vaatler reddedildikten sonra "halledilebilir". Yani, yakalama işleyicisi sağlamadan önce bir sözün reddetme geri çağrısı çağrılabilir. Bu davranış benim için biraz rahatsız edici çünkü biri yazabilir ...
var promise = new Promise(function(resolve) {
kjjdjf(); // this function does not exist });
... ve bu durumda, Söz sessizce reddedilir. Bir catch işleyici eklemeyi unutursa, kod hatasız sessizce çalışmaya devam eder. Bu, kalıcı ve bulunması zor hatalara yol açabilir.
Node.js durumunda, bu işlenmemiş Promise reddi ile başa çıkma ve sorunları bildirme söz konusudur. Bu beni ES7 zaman uyumsuzluğuna / beklemeye getiriyor. Bu örneği düşünün:
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;
}
Yukarıdaki örnekte, getRoomTemperature gerçekleştirilmeden önce teethPromise'ın reddedildiğini (Hata: diş macunu bitti!) Varsayalım. Bu durumda, dişleri bekleyene kadar işlenmemiş bir Promise reddi olacaktır.
Demek istediğim bu ... işlenmemiş Promise reddini bir sorun olarak değerlendirirsek, daha sonra bir bekleyiş tarafından gerçekleştirilen Promise'ler yanlışlıkla hata olarak bildirilebilir. Daha sonra, işlenmemiş Promise reddetmelerinin sorunlu olmadığını düşünürsek, meşru hatalar bildirilmeyebilir.
Bunun üzerine düşünceler?
Bu, Node.js projesinde bulunan tartışma ile ilgilidir:
Varsayılan İşlenmeyen Ret Algılama Davranışı
kodu şu şekilde yazarsanız:
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 çağrıldığında, eşzamanlı olarak başka bir vaatle aynı "işlenmemiş ret" hatasına sahip olacak (elbette motora bağlı olarak hiçbir şey olmayabilir) nihai (iade edilmez) vaadini yaratacaktır. (İşlevinizin hiçbir şey döndürmediğini çok garip buluyorum, bu da zaman uyumsuz işlevinizin tanımsız için bir söz verdiği anlamına geliyor.
Şu anda yakalamadan bir Söz veriyorum ve daha sonra bir tane eklersem, daha sonra ele aldığımda çoğu "işlenmeyen ret hatası" uygulaması aslında uyarıyı geri çeker. Başka bir deyişle, async / await "işlenmeyen ret" tartışmasını görebildiğim şekilde değiştirmiyor.
Bu tuzaktan kaçınmak için lütfen kodu şu şekilde yazın:
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);
}
Bunun işlenmemiş herhangi bir vaat reddini önlemesi gerektiğini unutmayın.