2016-06-29 9 views
-1

Ich bin mit der Aktualisierung meines Codes fest, um Versprechungen jetzt zu verwenden.Rewrite Javascript-Funktion mit Promises

Die Hash-Funktion funktioniert, wurde aber geändert. Es gibt jetzt ein Versprechen und keinen Wert mehr zurück. Und ich weiß nicht, wie es zu benutzen :-(

function hash(input) { 
    // transform the input into an arraybuffer. 
    let buffer = new TextEncoder("utf-8").encode(JSON.stringify(input)); 

    return window.crypto.subtle.digest("SHA-256", buffer).then((hash)=> { 
     return btoa(String.fromCharCode(...new Uint8Array(hash))); 
    }); 
} 

Dies ist die Funktion, die neu geschrieben werden muss. Hash (...) mehrmals aufgerufen wird.

function update(){ 

    // array of Objects (empty to simplify my question) 
    let data = [{}, {}, {}]; 


    // if data has changed => process it 
    if(hash(data) !== hash(previousData)){ 

     // clone for next time comparison (before calculating hashes!) 
     previousData = JSON.parse(JSON.stringify(data)); // simple deepclone 

     data.forEach(item=>{ 
      // reset dynamic values within a cloned item for simple item comparison checks 
      item.id = hash(Object.assign({}, item, {dynValue:1})); 

      //complet item hash including dynamic values 
      item.hash = hash(item); 
     }); 

     // fire event with changed data array 
     // ... 
    } 
} 

I‘ m Erstellen grundsätzlich zwei Hashes für jedes Objekt innerhalb des Arrays einen späteren Vergleich zu vereinfachen. eine mit einigen ignoriert Eigenschaften (auf die Standardwerte zurückgesetzt) ​​und eine für das komplette Objekt.

Danke für Ihre aushelfen

+0

Ich schlage vor, dass Sie kein Versprechen von der "Hash" -Funktion zurückgeben, da der Rest Ihres Codes auf der Prämisse basiert, dass Sie nicht sind. Warte einfach darauf, dass das Versprechen gelöst wird und gib das tatsächliche Ergebnis zurück. – apokryfos

+0

@apokryfos Wie würden Sie die Hash-Funktion umschreiben, um den Wert zurückzugeben? window.crypto bot.digest gibt nur ein Versprechen zurück. –

+0

Konnte möglicherweise eine alternative lib finden, die einen Wert zurückgibt. Vielleicht http://code.google.com/p/crypto-js? – apokryfos

Antwort

1

Im Idealfall, da die Änderung der Unmittelbarkeit der Hash-Funktion aufrufen, um Sie würden wollen versuchen und erhalten wird es eine so große Rewrite erfordern, jedoch in Abwesenheit von dieser könnte man wahrscheinlich mach etwas wie Versprechen ... dann Ketten.

function update() { 
    //Same code 
    Promise.all([hash(data), hash(previousData)]), then(values => { 
     if (values[0] !== values[1]) { 
      //Same code 
      var promiseChain = []; 
      data.forEach(item=> { 
       promiseChain.push(
         Promise.all([ 
           hash(Object.assign({}, item, {dynValue:1})), 
           hash(item) 
         ]).then(values=> { 
          item.id = values[0]; 
          item.hash = values[1]; 
         }) 
       ); 
      }); 
      Promise.all(promiseChain).then(/* fire event with changed data array */); 
     } 
    } 
} 
+0

Das ist perfekt, es funktioniert und ich habe etwas über Nesting Promises gelernt. –

1

Sie müssen sich im Vergleich ändern, weil Sie jetzt asynchronen Code schreiben. Der Vergleich muss warten bis beide Aufrufe an hash auflösen.

Beispielcode:

var hash = hash(data); 
var hashPrev = hash(previousData); 

hash.then((hashVal) => { 
    hashPrev.then((hashPrevVal) => { 
     if (hashVal == hashPrevVal) doFurtherLogicHere(); 
    }); 
});