2017-06-08 5 views
0

Am Ende meines Codes habe ich zwei Aktionen, die gleichzeitig ausgeführt werden, eine Abfrage, die eine Atler-Tabelle erstellt. Die zweite Einfügung.Node.js Ausführungsreihenfolgeabfragen

Das Problem ist, dass manchmal die Einfügung vor der alter-Tabelle passiert.

Wie kann ich den ersten Teil des Codes in der for-Schleife für alle Schlüssel ausführen, dann mit dem Einfügen fortfahren?

if (count >1) { 
     for(var i = 0; i < keys.length -1; i++) { 
     client.execute (queryadd, { prepare: true }, function (err) { 
     console.log("do"); 
     }); 
     } 
    } 


client.execute(queryinsert, { prepare: true }, function (err) { 
    console.log(err); 
    client.shutdown(); 
    }); 

Antwort

1

NodeJS cassandra Treiber unterstützt verspricht, so kann es so einfach gemacht werden, wie:

if (count > 1) { 
    for (const key of keys) { 
    await client.execute(queryadd); 
    } 
} 

await client.execute(queryinsert, params, { prepare: true }); 
await client.shutdown(); 

Wenn Sie alle queryadd parallel ausgeführt werden soll und dann queryinsert, dann können Sie tun:

if (count > 1) { 
    let queryadds = []; 
    for (const key of keys) { 
    queryadds.push(client.execute(queryadd)); 
    } 
    await Promise.all(queryadds); 
} 

await client.execute(queryinsert, params, { prepare: true }); 
await client.shutdown(); 
+0

Wenn ich erwarte, bekomme ich unerwartete Kennung für Client ...? –

+0

Werfen Sie einen Blick auf https://ponyfoo.com/articles/understanding-javascript-async-wait oder https://www.twilio.com/blog/2015/10/asyncawait-the-hero-javascript-deserved.html –

+0

Wenn Sie es6 nicht verwenden möchten, dann verwenden Sie einfach diese Bibliothek https://caolan.github.io/async/ –

0

Wenn Sie eine Callback-basierte Ausführung verwenden, sollten Sie eine Control-Flow-Bibliothek verwenden. Zum Beispiel mit async library:

const async = require('async'); 

async.eachSeries(keys, function eachKey(key, next) { 
    // Changing schema 
    client.execute(buildMyAlterQueryBasedOnKey(key), next); 
}, function eachFinished(err) { 
    if (err) { 
    // TODO: Handle err 
    } 
    client.execute(queryinsert, params, { prepare: true }, function (err) { 
    console.log(err); 
    // Finished, you should invoke your callback here 
    }); 
}); 

Wenn Sie Promises verwenden, können Sie die Kette den folgenden Aufruf mit then().

Einige Empfehlungen:

0

verwendet werden, können Sie Ihre Logik schreiben, als ob es sequentielle war, und führen Sie es über nsynjs:

Schritt 1. Legen Sie es in Funktion

function logic(count, keys, queryadd, queryinsert, client) { 
    if (count > 1) 
     for (var i=0; i<keys.length; i++) 
     client.execute(queryadd, { prepare: true }); 

    client.execute(queryinsert, { prepare: true }); 
    client.shutdown(); 
} 

Schritt 2. Führen Sie diese Funktion über nsynjs aus:

Nsynjs erkennt automatisch, ob eine Funktion eine Zusage zurückgibt, und wartet, bis das Versprechen gelöst/abgelehnt wurde, bevor der nächste Ausdruck ausgewertet wird.