Kannst du empfehlen, wie man einen Kontrollfluss mit vielen if/switch und Versprechungen richtig behandelt? Alle Tutorials im Internet, die ich gefunden habe, tendieren dazu, mit einem einfachen Kontrollfluss umzugehen, ohne viele (irgendwelche?) Unterschiedlichen Verarbeitungszweige. Irgendwelche Vorschläge zum Lesen oder zumindest Suchbegriffe?Node.js - Versprechen und Conidtional Statements (wenn, Schalter, etc) - wie zu strukturieren?
Die Art, wie ich es jetzt mache, besteht darin, if/switch-Logik in eine Funktion zu kapseln, die nach der Auswertung der Bedingungen eine Promise zurückgibt und zur Hauptprozessschleife zurückkehrt. Irgendein Weg, es besser, netter zu machen?
Beispielcode:
// Check if argument is a valid URL
Promise.promisify(checkUrl)().then(() => {
// Delete all query parameters from URL if present
return sanitizer.cleanAsync(argv.url)
}).then(_cleanUrl => {
cleanUrl = _cleanUrl;
logger.warn(`URL: ${cleanUrl}`);
// Validate Google Analytics view id supplied as '--gaId=<id>' command line argument or exit if it is not present
return Promise.promisify(checkGaId)()
}).then(() => {
// Check if DB exists, if not create it
return db.checkIfDatabaseExistsAsync()
}).then(() => {
// Check if all tables exist, if not create them
return db.checkTablesAsync()
}).then(() => {
// Check DB integrity (possiblDelete all query parameters from URL if presente to turn off in the config)
if (config.database.checkIntegrity) {
return db.integrityChecksAsync();
}
}).then(() => {
// Check if URL already exists in DB, if not insert it
return db.getOrCreateEntryUrlIdAsync(cleanUrl)
}).then(_entryId => {
entryId = _entryId;
// Check if any previous executions for the entry point exist and if so whether the last one completed
return db.getLastExecutionDataAsync(entryId);
}).then(lastExecution => {
// If last execution was not completed prompt for user action
return processLastExecution(entryId, lastExecution)
}).then(_pages => {
... more code follows here...
Und psuedo-Code für processLasExecution
Funktion:
function processLastExecution(entryId, lastExecution) {
return new Promise(
function (resolve, reject) {
// No previous executions found or all was okay
if (lastExecution == null || (lastExecution != null && lastExecution.is_completed == 'Y')) {
...resolves with A;
} else {
Promise.promisify(selectRunOption)().then(option => {
switch (option) {
case 'resume':
...resolves with B;
break;
case 'ignore':
...resolves with C;
break;
case 'delete':
...resolves with D;
break;
default:
...rejects
}
});
}
}
)
}
Jede Art und Weise des mit der if/Schaltlogik besser/klarer eingekapselt oder serviert ?
Oh, wenn sich jemand fragt, ist dies ein Befehlszeilenskript, keine Webanwendung, und das ist nicht genau das, was Node.js vorgesehen war.
Danke für die Idee sehen, aber ich würde Bleiben Sie lieber bei Promises und fügen Sie keine weiteren Abhängigkeiten hinzu, wenn sie nicht notwendig sind. – Farrkhar