Vaatlerin sadece sözdizimsel şeker olduğunu söylemek doğru olur. Geri aramalarla yapabileceğiniz her şeyi geri aramalarla yapabileceğinize söz veriyor. Aslında, en umut verici uygulamalar istediğiniz zaman ikisi arasında dönüşüm yolları sunar.
Sözlerin genellikle daha iyi olmasının en derin nedeni, daha iyi yapılabilmeleridir, bu da kabaca birden fazla sözün birleştirilmesinin "sadece işe yaraması" anlamına gelirken, aynı zamanda çok sayıda geri çağrının birleştirilmesi sık sık yapılmaz. Örneğin, bir değişkene bir söz vermek ve daha sonra buna ek işleyiciler eklemek ve hatta yalnızca tüm sözler çözüldükten sonra yürütülen geniş bir söz grubuna bir işleyici eklemek bile önemsizdir. Bunları geri aramalarla taklit edebilmenize rağmen, çok daha fazla kod alır, doğru şekilde yapılması çok zordur ve sonuç genellikle daha az bakım gerektirebilir.
En büyük (ve en ince) yollardan biri, sözde besteciliğini kazanma vaadi yollarından biri, getiri değerlerinin ve yakalanmamış istisnaların tek tip ele alınmasıdır. Geri aramalarla, bir istisnanın nasıl ele alındığı, tamamen iç içe geçmiş birçok geri aramadan hangisinin onu attığına ve geri aramaları alan işlevlerden hangisinin uygulanmasında bir dene / yetişme olduğuna bağlı olabilir. Vaatler ile, biliyorum bir geri çağırma işlevi kaçar bir durum yakalandı ve birlikte verilen hata işleyicisi geçirilir olacağını .error()
ya .catch()
.
Tek bir geri arama ile tek bir söz yerine verdiğiniz örnek için, önemli bir fark olmadığı doğrudur. Bir zilyon geri çağrısına sahip olduğunuzda, bir zilyon karşı sözlere dayalı kodun daha güzel görünme eğiliminde olduğuna dair söz verir.
İşte size sözlerle yazılmış bir varsayımsal kod ve daha sonra neden bahsettiğim hakkında bir fikir verecek kadar karmaşık olması gereken geri aramalarla yapılan bir girişim.
Sözlerle:
createViewFilePage(fileDescriptor) {
getCurrentUser().then(function(user) {
return isUserAuthorizedFor(user.id, VIEW_RESOURCE, fileDescriptor.id);
}).then(function(isAuthorized) {
if(!isAuthorized) {
throw new Error('User not authorized to view this resource.'); // gets handled by the catch() at the end
}
return Promise.all([
loadUserFile(fileDescriptor.id),
getFileDownloadCount(fileDescriptor.id),
getCommentsOnFile(fileDescriptor.id),
]);
}).then(function(fileData) {
var fileContents = fileData[0];
var fileDownloads = fileData[1];
var fileComments = fileData[2];
fileTextAreaWidget.text = fileContents.toString();
commentsTextAreaWidget.text = fileComments.map(function(c) { return c.toString(); }).join('\n');
downloadCounter.value = fileDownloads;
if(fileDownloads > 100 || fileComments.length > 10) {
hotnessIndicator.visible = true;
}
}).catch(showAndLogErrorMessage);
}
Geri aramalarla:
createViewFilePage(fileDescriptor) {
setupWidgets(fileContents, fileDownloads, fileComments) {
fileTextAreaWidget.text = fileContents.toString();
commentsTextAreaWidget.text = fileComments.map(function(c) { return c.toString(); }).join('\n');
downloadCounter.value = fileDownloads;
if(fileDownloads > 100 || fileComments.length > 10) {
hotnessIndicator.visible = true;
}
}
getCurrentUser(function(error, user) {
if(error) { showAndLogErrorMessage(error); return; }
isUserAuthorizedFor(user.id, VIEW_RESOURCE, fileDescriptor.id, function(error, isAuthorized) {
if(error) { showAndLogErrorMessage(error); return; }
if(!isAuthorized) {
throw new Error('User not authorized to view this resource.'); // gets silently ignored, maybe?
}
var fileContents, fileDownloads, fileComments;
loadUserFile(fileDescriptor.id, function(error, result) {
if(error) { showAndLogErrorMessage(error); return; }
fileContents = result;
if(!!fileContents && !!fileDownloads && !!fileComments) {
setupWidgets(fileContents, fileDownloads, fileComments);
}
});
getFileDownloadCount(fileDescriptor.id, function(error, result) {
if(error) { showAndLogErrorMessage(error); return; }
fileDownloads = result;
if(!!fileContents && !!fileDownloads && !!fileComments) {
setupWidgets(fileContents, fileDownloads, fileComments);
}
});
getCommentsOnFile(fileDescriptor.id, function(error, result) {
if(error) { showAndLogErrorMessage(error); return; }
fileComments = result;
if(!!fileContents && !!fileDownloads && !!fileComments) {
setupWidgets(fileContents, fileDownloads, fileComments);
}
});
});
});
}
Geri bildirimler sürümünde kod yinelemesini azaltmanın bazı sözleri olmasa bile, bazı akıllıca yollar olabilir;