यह कहना उचित है कि वादे सिर्फ चीनी हैं। सब कुछ आप वादे के साथ कर सकते हैं आप कॉलबैक के साथ कर सकते हैं। वास्तव में, अधिकांश वादे क्रियान्वयन जब चाहें तब दोनों के बीच रूपांतरण के तरीके प्रदान करते हैं।
अक्सर वादे बेहतर होने का गहरा कारण यह है कि वे अधिक संयोजनीय होते हैं , जिसका अर्थ मोटे तौर पर कई वादों को "सिर्फ काम करना" होता है, जबकि कई कॉलबैक का संयोजन अक्सर नहीं होता है। उदाहरण के लिए, यह एक चर के लिए एक वादा सौंपने और बाद में उस पर अतिरिक्त हैंडलर संलग्न करने के लिए तुच्छ है, या यहां तक कि वादों के एक बड़े समूह के लिए एक हैंडलर संलग्न करता है जो सभी वादों के समाधान के बाद ही निष्पादित होता है। जब आप कॉलबैक के साथ इन चीजों का अनुकरण कर सकते हैं, तो यह बहुत अधिक कोड लेता है, सही ढंग से करना बहुत कठिन है, और अंतिम परिणाम आमतौर पर बहुत कम बनाए रखने योग्य है।
सबसे बड़े (और सबटैस्टल) तरीकों में से एक यह है कि रिटर्न वैल्यूज़ और अनकैप्ड अपवादों की एक समान हैंडलिंग के द्वारा वादों को उनकी रचनाशीलता हासिल होती है। कॉलबैक के साथ, एक अपवाद कैसे संभाला जाता है, यह पूरी तरह से उस पर निर्भर हो सकता है कि कितने नेस्टेड कॉलबैक ने इसे फेंक दिया, और कॉलबैक लेने वाले कार्यों में से कौन सा इसके कार्यान्वयन में एक प्रयास / पकड़ है। वादे के साथ, आप जानते हैं कि एक अपवाद है जो एक कॉलबैक फ़ंक्शन निकल जाता है पकड़ लिया और त्रुटि हैंडलर आप के साथ प्रदान की को दे दिया जाएगा .error()
या .catch()
।
उदाहरण के लिए आपने एक एकल कॉलबैक बनाम एक वादे के साथ दिया, यह सच है कि कोई महत्वपूर्ण अंतर नहीं है। यह तब होता है जब आपके पास एक ज़िलियन कॉलबैक बनाम एक ज़िलियन वादे होते हैं जो वादा-आधारित कोड बहुत अच्छे लगते हैं।
यहाँ कुछ काल्पनिक कोड में वादों के साथ और फिर कॉलबैक के साथ एक प्रयास है जो आपको केवल कुछ विचार देने के लिए पर्याप्त जटिल होना चाहिए।
वादे के साथ:
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);
}
कॉलबैक के साथ:
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);
}
});
});
});
}
वादों के बिना भी कॉलबैक संस्करण में कोड डुप्लीकेशन को कम करने के कुछ चतुर तरीके हो सकते हैं, लेकिन मैं उन सभी को सोच सकता हूं जो कुछ बहुत ही वादों को लागू करने के लिए उबाल कर सकते हैं।