2016-05-10 11 views
2

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.

Antwort

0

Ich denke, es ist besser Generator zu verwenden, dann können Sie die Synchronisierung wie Codes schreiben:

co(function*() { 
    // Check if argument is a valid URL 
    if (yield checkUrl) { 
     var cleanUrl = yield sanitizer.cleanAsync(argv.url); 
     ... 
    } 
    ... 
}, ... 

Zusammenarbeit kann die Zusammenarbeit mit Rückruf und Versprechen, https://github.com/tj/co

+0

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